不能使用其他类的 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 &lt;UIScrollViewDelegate, ClassBDelegate, UITableViewDataSource, UITableViewDelegate&gt; @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的主要内容,如果未能解决你的问题,请参考以下文章

内部类的应用场景

Java中啥叫封装啊?

用于限制对类的访问的接口的角色

类的const成员

muduo buffer类的设计与使用

为啥我们不能在 kotlin 中将类的可见性标记为“受保护”?