как объявить количество строк, когда данные из diff. массив, необходимый, чтобы показать, какие из них имеют diff. содержание

Я работаю над приложением для напоминаний, и мне нужно было показать имя события, изображение события и время события. Все они получают значения из массива различий, но проблема в том, что если есть содержимое первого массива 2, а второго - три затем в Число строк в разделе, если я указал return[timeArray count]; приложение вылетает. Что делать??

вот мой код:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
   // return [timeArray count];

   // return [imagesArray count];

    return [nameArrayP2 count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{

    cell.timeLabel.text = [timeArray objectAtIndex:indexPath.row];
        cell.eventNameLbl.text =[nameArrayP2 objectAtIndex:indexPath.row];
        UIImage *image=[UIImage imageNamed:[imagesArray objectAtIndex:indexPath.row]];
        cell.imgView.image =image;

        return cell;
}

Обновлен код 6 июня:

 NSArray *timeA = [[NSUserDefaults standardUserDefaults]objectForKey:@"TimeArray"];
    timeArray =[[NSMutableArray alloc]init];
    [timeArray addObjectsFromArray:timeA];
    NSLog(@"%@",timeArray);


    NSArray *nameA = [[NSUserDefaults standardUserDefaults]objectForKey:@"nameArrayP2"];
    nameArrayP2 =[[NSMutableArray alloc]init];
    [nameArrayP2 addObjectsFromArray:nameA];
    NSLog(@"%@",nameArrayP2);


    NSArray *imageA =[[NSUserDefaults standardUserDefaults]objectForKey:@"images"];
    imagesArray =[[NSMutableArray alloc]init];
    [imagesArray addObjectsFromArray:imageA];
    NSLog(@"abhi%@",nameArrayP2);



    dataMutableArray = [[NSMutableArray alloc]init];

    NSDictionary *dataDict = [[NSDictionary alloc]initWithObjectsAndKeys:nameArrayP2,@"eventTitle", timeArray,@"eventTime",imagesArray, @"eventImage", nil];

     NSDictionary *dataDict1 = [[NSDictionary alloc]initWithObjectsAndKeys:nameArrayP2,@"eventTitle", timeArray,@"eventTime",imagesArray, @"eventImage", nil];
    //dataMutableArray =[NSMutableArray arrayWithArray:[dataDict allValues]];
    [dataMutableArray addObject:dataDict]; [dataMutableArray addObject:dataDict1];

   // [dataMutableArray addObject:dataDict];
    NSLog(@"All Data=%@",dataMutableArray);

person iOSBeginner    schedule 23.05.2017    source источник
comment
Я почти уверен, что вы можете просто изменить его, когда вам нужно загрузить другой массив, проверьте, имеет ли ваш объект TableView свойство numberOfRowsInSection, где вы можете присвоить новое значение   -  person JamesRGNT    schedule 23.05.2017
comment
@JamesRGNT Я должен показывать весь контент каждый раз, когда содержимое этого массива не совпадает в no.then возникает ошибка.   -  person iOSBeginner    schedule 23.05.2017
comment
Я не понял, как можно было получить разное количество в массиве. Это должно быть то же самое, если вы сохраняете набор из 3 (имя, изображение, время) в соответствующем массиве. Но лучший подход - без сохранения в массиве, вы должны брать объекты.   -  person Janmenjaya    schedule 23.05.2017
comment
@Janmenjaya, поскольку у некоторых событий нет изображения, возникает эта ошибка. Я сохраняю ее, покупая, используя NSuserdefaults. Можете ли вы сказать мне, как использовать объекты ??? Я новичок в iOS, пожалуйста, подумайте, если это глупый вопрос. Спасибо !   -  person iOSBeginner    schedule 23.05.2017


Ответы (4)


Вы можете создать объект для события, в котором вы можете иметь свойство для имени, изображения, времени и т. д.,

Перед перезагрузкой tableView создайте объект из списка массива и сохраните это событие как объект в массиве и используйте то же самое для tableView.

person Arasuvel    schedule 23.05.2017

У вас должен быть пользовательский объект, который следует инициализировать с использованием другого массива данных, а затем в методах источника данных tableview использовать массив настраиваемого объекта.

NSArray *eventArray = [self loadEventArray:timeArray withImage:imageArray withName:nameArray];

- (NSArray*) loadEventArray:(NSArray*) timeArray withImage:(NSArray*) imageArray withName:(NSArray*) nameArray {

NSMutableArray *eventArray = [[NSMutableArray alloc] init];

for(int anIndex = 0; anIndex < [nameArray count]; anIndex++){
    Event *event = [[Event alloc] init]; // Custom Object
    // Your logic to identify event and assign name
}

for(int anIndex = 0; anIndex < [imageArray count]; anIndex++){
    // Fetch the linked event from event Array
    // assign image
}

for(int anIndex = 0; anIndex < [timeArray count]; anIndex++){
    // Fetch the linked event from event Array
    // assign time
}

return eventArray;
}
person Anuj Panwar    schedule 23.05.2017

Вы можете просто создать массив словарей. Возьмите свойство NSMutableArray, если вы хотите позже манипулировать массивом для добавления или удаления событий.

NSMutableArray *dataMutableArray = [[NSMutableArray alloc]init];

Вы можете создать словарь данных и добавить его в свой массив. Что-то вроде этого.

NSDictionary *dataDict = [[NSDictionary alloc]initWithObjectsAndKeys:@"I am event title",@"eventTitle", @"I am image",@"eventImage",@"I am event time", @"eventTime", nil];

[dataMutableArray addObject:dataDict];

Вы также можете создать класс модели, который содержит данные о событиях, например

@property (strong, nonatomic) NSString *eventName;
@property (strong, nonatomic) NSString *eventTime;
@property (strong, nonatomic) NSString *eventDate;

//Inside your view controller
    EventData *eventObject = [[EventData alloc]init];
    eventObject.eventTime = @"I am event time";
    eventObject.eventImage = @"I am image";
    eventObject.eventTitle = @"I am event title";

    [dataMutableArray addObject:eventObject];

Ниже будут ваши методы источника данных tableview.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [dataMutableArray count];
}



    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
        {
//You can use any of the one approach 
//1)
            NSDictionary *dataDict = [dataMutableArray objectAtIndex:indexPath.row];

            cell.timeLabel.text = [dataDict valueForKey:@"eventTime"];
            cell.eventNameLbl.text =[dataDict valueForKey:@"eventTitle"];
            UIImage *image=[UIImage imageNamed:[dataDict valueForKey:@"eventImage"]];
            cell.imgView.image =image;

            return cell;

//2)    
        EventData *eventObject = [dataMutableArray objectAtIndex:indexPath.row];

       cell.timeLabel.text = eventObject.eventTime;
       cell.eventNameLbl.text = eventObject.eventTitle;
       UIImage *image=[UIImage imageNamed:eventObject.eventImage];
       cell.imgView.image =image;

       return cell;

    }
person Dhaval Soni    schedule 23.05.2017
comment
спасибо за ответ. Это решило мою проблему сбоя, но теперь, если один из моих массивов содержит несколько данных, он должен отображаться во второй строке, но показывает только первое значение и только одну строку. - person iOSBeginner; 06.06.2017
comment
Data{ eventImage = ( Meeting-ico.png, video-ico.png, shopping-ico.png, video-ico.png ); время события = (07.45); eventTitle = ( встреча, видео, покупки, видео ); } вот так. в этом он должен вернуть мне четыре строки, но показывает только одну - person iOSBeginner; 06.06.2017
comment
Приведенный выше код я продемонстрировал только для одной записи. Вам нужно создать другой словарь или объект с другим значением и добавить его в массив и так далее. - person Dhaval Soni; 06.06.2017
comment
Можете ли вы привести пример для нескольких? Так как я пробовал это для нескольких и не повезло :( - person iOSBeginner; 06.06.2017
comment
Можете ли вы попробовать этот код ниже. NSDictionary *dataDict = [[NSDictionary alloc]initWithObjectsAndKeys:@Я — название события, @eventTitle, @Я — изображение, @eventImage, @Я — время события, @eventTime, nil]; NSDictionary *dataDict1 = [[NSDictionary alloc]initWithObjectsAndKeys:@Я — название события, @eventTitle, @Я — изображение, @eventImage, @Я — время события, @eventTime, nil]; [dataMutableArray addObject: dataDict]; [dataMutableArray addObject: dataDict1]; - person Dhaval Soni; 06.06.2017
comment
это дает мне такую ​​​​ошибку: - «NSInvalidArgumentException», причина: «- [__ NSDictionaryI length]: нераспознанный селектор отправлен экземпляру 0x60800026a540» - person iOSBeginner; 06.06.2017
comment
В каком методе выдает ошибку? Можете ли вы сообщить мне длину dataMutableArray после добавления этих двух словарей. - person Dhaval Soni; 06.06.2017
comment
В нет. строк в разделе должно быть [dataMutableArray count]. - person Dhaval Soni; 06.06.2017
comment
Я делаю то же самое. - person iOSBeginner; 06.06.2017
comment
Не могли бы вы поделиться своим кодом инициализации, пожалуйста. Мне нужно взглянуть на это. - person Dhaval Soni; 06.06.2017
comment
Попробуйте этот код. for (int i = 0; i ‹ nameArrayP2.count; i++) { NSDictionary *dataDict = [[NSDictionary alloc]initWithObjectsAndKeys:[nameArrayP2 objectAtIndex:i],@eventTitle, [timeArray objectAtIndex:i],@eventTime,[imagesArray objectAtIndex :i], @eventImage, ноль]; [dataMutableArray addObject: dataDict]; } - person Dhaval Soni; 06.06.2017
comment
Теперь точно не падает. Можете ли вы поделиться своим кодом метода cellForRowAtIndexPath. - person Dhaval Soni; 06.06.2017
comment
NSDictionary *dataDict = [dataMutableArray objectAtIndex:indexPath.row]; cell.timeLabel.text = [dataDict valueForKey:@eventTime]; cell.eventNameLbl.text =[dataDict valueForKey:@eventTitle]; UIImage *image=[UIImage imageNamed:[dataDict valueForKey:@eventImage]]; cell.imgView.image = изображение; - person iOSBeginner; 06.06.2017
comment
Я предполагаю, что ваши пользовательские данные по умолчанию пусты, поэтому сейчас они ничего не отображают. Проверьте, есть ли внутри nameArrayP2 какие-либо данные. - person Dhaval Soni; 06.06.2017
comment
во-первых, он не показывает никаких данных nameArrayP2, но я изменил сейчас, и в этом есть один объект, но он показывает это сообщение в области отладки: время ожидания истекло через 0,012 с (5060 5061); количество приостановок = 0 (IOSuspensions: ) - person iOSBeginner; 06.06.2017
comment
привет, приятель, теперь он показывает одно значение, но мой массив времени имеет 2 значения, и он показывает только одно значение. - person iOSBeginner; 06.06.2017
comment
вам нужно хранить весь массив словарей внутри пользовательских значений по умолчанию. Текущая реализация неверна из-за несоответствия в записях имени, времени и изображения. Итак, вам нужно создать массив и добавить весь словарь так, как я создал в своем коде, и сохранить этот массив в пользовательских настройках по умолчанию. Таким образом, он будет иметь последовательный счет. Поэтому вам нужно изменить логику хранения. - person Dhaval Soni; 06.06.2017
comment
хорошо. спасибо за помощь, приятель. Я попробую. Очень ценю ваши усилия :) - person iOSBeginner; 06.06.2017

Вы должны следовать этому пути

Возьмите один класс NSObject, скажем, EventBO, и возьмите 2 атрибута NSString и 1 NSDate (или в соответствии с вашими требованиями выберите другой тип), например (eventName, eventImage, eventTime). NB: оставьте имя изображения в свойстве изображения.

#import <Foundation/Foundation.h>
@interface EventBO : NSObject

@property (nonatomic, strong) NSString *eventName;
@property (nonatomic, strong) NSString *eventImage;
@property (nonatomic, strong) NSDate *eventTime;

@end

В вашем контроллере:

Возьмите глобальный изменяемый массив, скажем, NSMutableArray *arrEvents

Разместите массив (желательно на viewDidLoad)

arrEvents = [[NSMutableArray alloc] init];

Затем присвойте значения Event (т.е. eventName, eventTime и eventImage) в объекте и добавьте объект в глобальный массив.

EventBO *objEvent = [[EventBO alloc]init];
objEvent.eventName = @"test";
objEvent.eventImage = @"test.png";
objEvent.eventTime = [NSDate date]; //You can put your time, I have set current date-time

[arrEvents addObject:objEvent]

Теперь используйте массив в таблице для извлечения объекта и отображения данных.

person Janmenjaya    schedule 23.05.2017