不能使用其他类的 reloadData
Posted
技术标签:
【中文标题】不能使用其他类的 reloadData【英文标题】:Can't use reloadData from another class 【发布时间】:2013-02-20 11:57:33 【问题描述】:我有 2 个班级,classA 和 classB
在 A 类中,我有一个可以按需工作和刷新的表格视图。所有的代表和数据源都很好,还有一个属性@property (nonatomic, retain) UITableView *myTableView;
我不想将reloadData
放在 classA 的 viewDidAppear 或 viewWillAppear 中。
我想从 B 类解雇 [myTable reloadData]
。
谢谢
【问题讨论】:
一种选择是使用委托方法。这是一个minimal reproducible example[1] 以了解如何操作。 [1]:***.com/questions/8055052/… 【参考方案1】:使用委托重新加载您的表格视图。
在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];
最后,在您要重新加载表格视图的类中 粘贴以下行(重要的是,此行进入要重新加载 tableview 的方法):
[[NSNotificationCenter defaultCenter] postNotificationName:@"updateLeftTable" object:self];
如果你有任何问题,请告诉我。
【讨论】:
一个解释会很好【参考方案2】:当你调用 classA *test = [[classA alloc]init]; ,它会为您的 A 类创建一个新对象,并且对于您在此类中声明的每个变量,它都具有 nil 值。这就是为什么不调用您的 reloaddata 的原因,因为您的数组对于您用于重新加载表的该对象具有 nil 值。
您必须使用委托将A类的对象传递给B类。然后尝试从该委托对象重新加载表。
【讨论】:
【参考方案3】: 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];
【讨论】:
我收到Cannot find protocol declaration for 'ClassBDelegate'
你在ClassA.h中导入ClassB.h了吗?
您在哪个班级遇到此错误?如果在 ClassB 中,则在 ClassB.h 的顶部声明协议...高于一切...
我在 A 类中得到它:@interface classA : UIViewController <UIScrollViewDelegate, ClassBDelegate, UITableViewDataSource, UITableViewDelegate>
@Sha 可能会形成循环。如果Class A
被导入到Class B
中,Class B
也被导入到Class A
中。如果是这种情况,请在单独的文件中声明协议。【参考方案4】:
来自documentation:
为了提高效率,表格视图只重新显示那些可见的行。
因此,如果您的 tableView
不可见,则不会更新。
【讨论】:
【参考方案5】:调用 reloadData 方法会在调用该方法后立即刷新数据。在调用 reloadData 之前,确保数据源(数组或字典或保存值的位置)已更改。
您应该尝试在主线程上重新加载数据: [tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
【讨论】:
【参考方案6】:我认为你应该由代表重新加载它。
你的 ClassB.h 这里你需要添加你的委托
@property (nonatomic, strong) id myDelegate;
这里是你的 ClassA.m 当你要去 ClassB 时显示他的代表 t 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];
希望我记得代表足够好)我是凭记忆写的)) 希望对你有帮助
【讨论】:
一个解释会很好【参考方案7】:检查您的UITableView
属性在您调用reloadData
时是否有效。 UIViewController
是通过调用alloc init
创建的,但您的视图当前处于无效状态。在 reloadData 代码行中设置断点并检查您是 .tableView == nil 吗?
【讨论】:
以上是关于不能使用其他类的 reloadData的主要内容,如果未能解决你的问题,请参考以下文章