2013-06-03 3 views
0

У меня есть метод в моем классе «MasterView»(), который анализирует данные .json из URL, а затем заполняет представление таблицы информацией. Чтобы быть более организованным и сгруппировать метод с помощью других необходимых методов, я попытался переместить его в другой класс NSOject, но он не сработал; нет ошибок, никаких исключений, представление таблицы просто не заполняется.Метод не работает при передаче другому классу

Вот оригинальный метод в «Мастер-класс»

- (void) fetchPosts: 
{ 
    NSError *error; 

    NSData *responseData = [NSData dataWithContentsOfURL:myURL]; 

    NSDictionary *json = [NSJSONSerialization 
         JSONObjectWithData:responseData 

         options:kNilOptions 
         error:&error]; 

    NSArray *objects = [[json objectForKey:@"data"] objectForKey:@"children"]; 

    arr = [[NSMutableArray alloc] init]; 

    for (NSDictionary *object in objects) { 
     NSString *title = [[object objectForKey:@"data"] objectForKey:@"title"]; 

     //Post is just a random NSObject Class 
     Post *post = [[Post alloc] init]; 
     post.title = title; 
     [arr addObject:post]; 
    } 

    NSLog(@"Called"); 
    [self.tableView reloadData]; 
} 

Отредактированный метод в другом классе:

- (void) fetchPosts:(NSURL *)myURL withPostArray:(NSMutableArray*)postArr andTableView: (UITableView*)tableView 
{ 
    NSLog(@"CAlled"); 

    NSError *error; 

    NSData *responseData = [NSData dataWithContentsOfURL:myURL]; 

    NSDictionary *json = [NSJSONSerialization 
         JSONObjectWithData:responseData 

         options:kNilOptions 
         error:&error]; 

    NSArray *objects = [[json objectForKey:@"data"] objectForKey:@"children"]; 

    postArr = [[NSMutableArray alloc] init]; 

    for (NSDictionary *object in objects) { 
     NSString *title = [[object objectForKey:@"data"] objectForKey:@"title"]; 

     Post *post = [[Post alloc] init]; 
     post.title = title; 
     [postArr addObject:post]; 
    } 


    [tableView reloadData]; 
} 

оригинальный метод, который работает, называется: [self fetchPosts:]; другой: [MyClass fetchPosts:myUrl withPostArray:arr andTableView:self.tableView];

Я отредактировал некоторую информацию, чтобы сделать ее более читаемой, поэтому, пожалуйста, дайте мне знать, если есть какие-либо ошибки.

MyClass.h:

@interface MyClass : NSObject <UITableViewDelegate, UITableViewDataSource> 

Настройка источника данных в MasterView:

//In ViewDidLoad 
_delegate = myClass; 

self.tableView.dataSource = _delegate; 
self.tableView.delegate = _delegate; 

//In .h 

@property (strong, nonatomic) MyClass *delegate; 

Im не получая ничего от компилятора, когда я называю [MyClass fetchPosts:myUrl withPostArray:arr andTableView:self.tableView];

+0

Не читая источник, я предполагаю, что какой-то указатель равен нулю, потому что вы его не инициализировали. Или, как предполагает Моханнад, если метод вообще не вызван, скорее всего, вы неправильно указали указатель делегата. –

ответ

1

Если табличное не заполняет , то представление таблицы не получает необходимые данные через источник данных.

Вполне возможно, что вы не установили dataSource из ваших tableView к новому NSObject вы создали, или что MasterView по-прежнему dataSource из tableView.

Кроме того, убедитесь, что этот метод фактически вызывается, а пройденный tableView - тот, который представлен в представлении.


Edit: У вас есть три решения:

  1. Назначьте источник данных для нового объекта, созданного таким образом обрабатывает обновления представления таблицы с данными, так как он теперь имеет фактические данные.
  2. Откорректируйте этот метод, чтобы вернуть проанализированные данные в MasterView, и он вызывает [self.tableView reloadData]. Но это не очень хорошо с точки зрения MVC.
  3. Третий вариант требует, чтобы вы создали UIVieController для обработки вашего MasterView, и это должно быть dataSource для просмотра таблицы. Контроллер представления должен вызывать указанный метод из нового объекта, чтобы получить данные и обновить представление таблицы. , т. Е. Как второе решение, но контроллер вида вызовет метод, а не MasterView.
+0

Я немного растерялся в том, что делать на основе того, что вы сказали, но «я».tableView' является свойством «Master», а источником данных является «MasterView». Также я заметил, что компилятор действительно говорит «Вызывается», как это должно быть при вызове метода. – Tanner

+0

Тогда проблема 'dataSource' установлена ​​в неправильном объекте. «DataSource» в представлении таблицы является объектом, ответственным за предоставление разделов, строк и всех связанных данных в представлении таблицы. –

+0

@Tanner Проверьте мои изменения, пожалуйста. –

Смежные вопросы