无法使用其他类的reloadData

时间:2013-02-20 11:57:34

标签: ios objective-c cocoa-touch cocoa

我有2个班,classA和classB 在classA中,我有一个tableview,可以按需工作和刷新。所有委托和数据源都很好,还有一个属性@property (nonatomic, retain) UITableView *myTableView;

我不想将reloadData放在classA的viewDidAppear或viewWillAppear中。 我想从classB中解雇[myTable reloadData]

由于

7 个答案:

答案 0 :(得分:16)

使用代理人重新加载您的tableview。

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

告诉我你是否有任何问题。

答案 1 :(得分:1)

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

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

答案 2 :(得分: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];

    }

答案 3 :(得分:0)

我想你应该由代表重新加载。

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

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

答案 4 :(得分:0)

来自documentation

  

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

检查您的UITableView媒体资源在您拨打reloadData时是否有效。 UIViewController是通过调用alloc init创建的,但您的视图目前处于无效状态。在reloadData代码行中设置断点并检查你.tableView == nil?