调用[tableView reloadData];在 modalViewController 的 viewController 上

Posted

技术标签:

【中文标题】调用[tableView reloadData];在 modalViewController 的 viewController 上【英文标题】:Call [tableView reloadData]; on a viewController from a modalViewController 【发布时间】:2013-03-04 05:29:25 【问题描述】:

我有一个 modalViewController,它出现在带有 tableView 的 viewController 的顶部。当用户单击 modalViewController 上的按钮时,我想在 viewController 中重新加载 tableView:

[tableView1 reloadData]; 

我不想将重新加载放在 viewDidAppear 或 viewWillAppear 方法中,因为当我不需要重新加载 tableView 时(即当用户单击后退按钮返回到 tableView 时)会调用它们。

有没有办法做到这一点?

【问题讨论】:

通过通知或委托。 嗨,Anil,我不确定该怎么做。您有任何入门示例或建议吗? @Brandon 代表。这对你真的很有帮助。 看看这个***.com/questions/6168919/… 是的,请遵循 Anil 链接中给出的步骤。并在您的 ViewController 中使用 reloadData 实现委托方法。 【参考方案1】:

试试

1) 编写一个reloads table data 的方法。

2) 在后面调用button点击。

【讨论】:

嗨 Girish,我已经建立了方法。我想在用户单击模式视图上的按钮而不是后退按钮时调用它。你知道该怎么做吗? 我相信 Girish 的意思是在 viewcontroller(有你的 tableview)中创建你的 reload 方法并从 modalviewcontroller 调用它 在这种情况下,创建一个在您单击按钮时自动调用的委托。 @JohnRiselvato 你是对的,但如果他不想要这个,那么就像我在之前的评论中提到的那样使用代表。 @JohnRiselvato 我想我只是不知道如何从另一个 viewController 调用方法【参考方案2】:

这是典型的委托模式问题,在您的模态视图控制器中,您需要对当前视图控制器的委托引用来呈现它

//Modal
@protocol ModalVCDelegate
- (void)tappedBackButton;
@end

@class ModalVC: UIViewController
@property id<ModalVCDelegate> delegate;
@end

@implementation
- (void)backButtonTapped:(id)sender

    if (self.delegate) 
        [self.delegate tappedBackButton];

@end

现在,在你展示的 VC 中,处理这个委托消息

//Parent VC
- (void)showModal

    ModalVC *vc = [ModalVC new]; 
    vc.delegate = self;
    //push


- (void)tappedBackButton

    [self.tableView reloadData];
    //close modal

【讨论】:

【参考方案3】:

您可以使用委托。如果发现它更难,那么替代方法是使用NSNotificationCenter。您可以看到Refreshing TableView 的已接受答案。这是非常简短、简单易懂的方式。

【讨论】:

【参考方案4】:

使用如下通知方法:-

在 yourViewController 的 ViewdidLoad 方法中创建 NSNotificationCenter

- (void)viewDidLoad

    [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(ReloadDataFunction:)
                                                     name:@"refresh"
                                                   object:nil];

  [super viewDidLoad];


-(void)ReloadDataFunction:(NSNotification *)notification 

    [yourTableView reloadData];


现在您可以从您的 modelViewController BackButton 调用此通知,或者您希望调用此 Refresh 通知,例如放置这行代码:-

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

注意: postNotificationName:@"refresh" 这是特定通知的键

【讨论】:

【参考方案5】:

尝试使用这个

制作一个按钮并单击此按钮,然后您可以重新加载数据。 此按钮可自定义并在背景中使用。

  - (IBAction)reloadData:(id)sender
    
         [tblView reloadData];
    

【讨论】:

【参考方案6】:
You can use NSNotification to refresh table on ViewController.

Inside viewController :

-(void)dealloc
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];


Write code in viewDidLoad:
[[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(reloadMainTable:) 
        name:@"ReloadTable"
        object:nil];




- (void) reloadMainTable:(NSNotification *) notification

  [tableView reload];



Inside ModelViewController:
[[NSNotificationCenter defaultCenter] 
        postNotificationName:@"ReloadTable" 
        object:nil];

Here you can also send custom object instead of nil parameter. But be care full about removal of NSNotification observer.

【讨论】:

你好,谁能告诉我?

以上是关于调用[tableView reloadData];在 modalViewController 的 viewController 上的主要内容,如果未能解决你的问题,请参考以下文章

尝试调用 tableView.reloadData 时出现 NSInvalidArgumentException?

iOS - tableView 的 reloadData 不调用 cellForRowAtIndexPath

仅在 reloadData 完成后调用函数

tableView.reloadData() 不起作用,可能没有在主线程上调用

升级到 iPhone OS 4 后,我的 TableView 在调用 reloadData 后滚动到顶部

调用[tableView reloadData];在 modalViewController 的 viewController 上