2013-02-20 3 views
2

У меня есть 2 класса, класс A и классB В классеA У меня есть табличное представление, которое работает и обновляется по требованию. все делегаты и источники данных в порядке, а также есть имущество @property (nonatomic, retain) UITableView *myTableView;Невозможно использовать reloadData из другого класса

Я не хочу ставить reloadData в видуDidAppear или viewWillAppear of classA. Я хочу сжечь [myTable reloadData] из классаB.

Thanks

+1

Одним из вариантов является использование метода делегата. Ниже приведен пример [1]. [1]: http://stackoverflow.com/questions/8055052/call-a-parent-view-controller-through-a-navigationcontroller – user523234

ответ

16

Используйте делегатов для перезагрузки таблицы.

В классе, где TableView есть, написать в viewDidLoad:

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"updateLeftTable" 
               object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(checkRes:) name:@"updateLeftTable" object:nil]; 

Затем в том же классе реализовать свою функцию следующим образом:

-(void)checkRes:(NSNotification *)notification 
{ 
    if ([[notification name] isEqualToString:@"updateLeftTable"]) 
    { 
     [_rearTableView reloadData]; 
    } 
} 

Наконец, в классе, где вы хотите перезагрузить табличный вид вставьте следующую строку (важно, чтобы эта строка проходила в методе, из которого вы хотите перезагрузить таблицу):

[[NSNotificationCenter defaultCenter] postNotificationName:@"updateLeftTable" object:self]; 

Сообщите мне, если у вас есть проблемы.

+1

объяснение было бы здорово – Segev

+0

ok позвольте мне объяснить, – aBilal17

+0

+1 за хороший ответ и спасибо большое .. – Shivaay

0

Я думаю, что u должен перезагрузить его делегатами.

Здесь ваш ClassB.h Здесь и нужно добавить делегат

@property (nonatomic, strong) id myDelegate; 

Вот ваш ClassA.m Когда у собираются ClassB показать его делегатом т ClassA

ClassB *goNext = [[ClassB alloc] initWithNibName:@"ClassB" bundle:nil]; 
goNext.myDelegate = self; // ALL YOUR BASE ARE BELONG TO US! 
[self.navigationController pushViewController:goNext animated:YES]; 

Следующая. Если и хотят, чтобы перезагрузить ваш CLASSA Tableview использовать такой код:

if (myDelegate && [myDelegate respondsToSelector:@selector(reloadMyTV)]){ 
     [myDelegate performSelector:@selector(reloadMyTV) withObject:nil]; 
    } 

где «reloadMyTV» является методом ClassA:

-(void) reloadMyTV { 
[myTableView reloadData]; 
} 

Надежда Я помню делегат достаточно хорошо) я написал по памяти)) Надеюсь, что это поможет

+0

объяснение было бы здорово – Segev

0

из documentation:

Для повышения эффективности, в представлении таблицы отображаются только те строки, которые видны.

так что если ваш tableView не виден, то он не будет обновлен.

1

Когда вы вызываете classA * test = [[classA alloc] init]; , он создает новый объект вашего класса A и имеет значение nil для всех переменных, которые вы объявляете в этом классе. Вот почему ваш reloaddata не вызывается, потому что ваш массив имеет значение nil для этого объекта, который вы используете для перезагрузки таблицы.

Вы должны использовать делегат для передачи объекта из класса A в класс B. И затем попытайтесь перезагрузить таблицу из этого объекта делегата.

1
ClassB.h 

    @protocol ClassBDelegate <NSObject> 

    -(void)reloadTableView; 


    @end 

    @property (nonatomic,weak)id<ClassBDelegate>delegate; 


    ClassB.m 

    -(void)methodForReloadingTableViewInClassA 
    { 

    [self.delegate reloadTableView]; 

    } 




Class A.h 
#import ClassB.h 
@interface ClassA : UITableViewController<UITableViewDelegate,UITableViewDatasource,ClassBDelegate> 
{ 
} 

ClassA.m 
-(void)createClassB 
{ 
    ClassB *obj = [[ClassB alloc]init]; 
    obj.delegate = self; 
} 

    //delagte method of class B 
    -(void)reloadTableView 
    { 

    [self.tableView reloadData]; 

    } 
+0

Я получаю 'Не могу найти объявление протокола для 'ClassBDelegate' ' – Segev

+0

ли вы импортировали ClassB.h в ClassA.h? –

+0

да я. Даже попробовал это в новом проекте. – Segev

0

Вызов метода reloadData обновляет данные, как только вызывается метод. Перед вызовом reloadData убедитесь, что источник данных (массив или словарь или везде, где вы сохранили значения).

И вы должны попробовать перезагрузить данные по основному потоку: [tableView выполняетSelectorOnMainThread: @selector (reloadData) withObject: nil waitUntilDone: NO];

0

check is your UITableView Недвижимость действительна в данный момент, как вы звоните reloadData. UIViewController создается по вызову alloc init, но ваш взгляд в настоящее время неактуальен. Установите точку останова в reloadData строке кода и проверьте, что вы .tableView == nil?

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