2

我有 2 个类,classA 和 classB 在 classA 中,我有一个可以按需工作和刷新的表格视图。所有的代表和数据源都很好,还有一个属性@property (nonatomic, retain) UITableView *myTableView;

我不想放入reloadDataclassA 的 viewDidAppear 或 viewWillAppear。我想[myTable reloadData]从 B 级开火。

谢谢

4

7 回答 7

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];
   }
}

最后,在要重新加载 tableview 的类中粘贴以下行(重要的是,此行进入要重新加载 tableview 的方法中):

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

如果您有任何问题,请告诉我。

于 2013-02-20T12:02:38.153 回答
1

当你调用 classA *test = [[classA alloc]init]; ,它会为您的 A 类创建一个新对象,并且对于您在此类中声明的每个变量,它的值都为零。这就是为什么不调用您的 reloaddata 的原因,因为您的数组对于您用于重新加载表的该对象具有 nil 值。

您必须使用委托将 A 类的对象传递给 B 类。然后尝试从此委托对象重新加载表。

于 2013-02-20T12:08:07.783 回答
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];

    }
于 2013-02-20T12:14:03.717 回答
0

我认为你应该由代表重新加载它。

在这里你的 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];
}

希望我记得代表足够好)我是凭记忆写的))希望它会有所帮助

于 2013-02-20T12:00:38.853 回答
0

文档

为了提高效率,表格视图只重新显示那些可见的行。

因此,如果您tableView不可见,则不会更新。

于 2013-02-20T12:01:09.163 回答
0

调用 reloadData 方法会在调用该方法后立即刷新数据。确保在调用 reloadData 之前更改了数据源(数组或字典或保存值的位置)。

您应该尝试在主线程上重新加载数据: [tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

于 2013-02-20T12:17:24.603 回答
0

检查您的UITableView财产在您致电时是否有效reloadDataUIViewController是通过调用创建的alloc init,但您的视图当前处于无效状态。在 reloadData 代码行中设置断点并检查您是 .tableView == nil 吗?

于 2013-02-20T12:34:38.020 回答