更新tableView数据

时间:2013-09-30 22:53:19

标签: ios objective-c uitableview

我在UIView中嵌入了一个UITableView,我无法弄清楚如何更新。当我在UIView中嵌入UITableView来到这个页面时,有一个按钮,当按下时会弹出一个modalForm。有一个textField,用户输入一个名称,然后按下另一个按钮来“创建”该对象,关闭modalForm,并更新应用程序数据。但是,我不确定如何刷新我的UITableView数据...当modalForm视图被解除时,有没有办法告诉UITableView刷新?

编辑:我知道我需要发送此消息[tableView reloadData];才能刷新,但我想知道我可以把它放在哪里以便在解雇modalForm时调用它?

6 个答案:

答案 0 :(得分:2)

在呈现和解除模态的视图控制器中,您应该调用dismissViewControllerAnimated:completion方法来关闭模态。模式不应该解雇自己。您可以使用完成块来执行您希望在模态完成解除时执行的任何代码。示例如下。

[self dismissViewControllerAnimated:YES completion:^{
    //this code here will execute when modal is done being dismissed
    [_tableView reloadData];
}];

当然不要忘记避免在街区强烈捕获自己。

如果您最终让模态消失,您将需要一个委托方法,以便模式可以与呈现视图控制器进行通信,或者由模式发送并由呈现视图控制器捕获的通知,或者您可以在呈现视图控制器中实现viewWillAppear:。每次视图即将出现时,此方法都会触发。这意味着第一次以及模态被解散后,即将展示它呈现的顶部视图。

<强> -------------------------------------------- --------------------------------------------

以下是编写自己的协议并使用它的示例。

MyModalViewController.h

@protocol MyModalViewControllerDelegate <NSObject>

//if you don't need to send any data
- (void)myModalDidFinishDismissing;

//if you need to send data
- (void)myModalDidFinishDismissingWithData:(YourType *)yourData

@end

@interface MyModalViewController : UIViewController

@property (weak) id <MyModalViewControllerDelegate> delegate;

//place the rest of your properties and public methods here

@end

您希望在MyModalViewController实现文件中的任何位置,调用您选择的委托方法。您应首先确保您的委托实际响应选择器。 MyModalViewController.m     if([self.delegate respondsToSelector:@selector(myModalDidFinishDismissing)])             [self.delegate myModalDidFinishDismissing];

在呈现模态的viewcontroller中,您需要在头文件中声明您符合协议,您需要将模态的委托设置为viewcontroller,并确保实际实现委托方法打算使用。

MyPresentingViewController.h

@interface MyPresentingViewController : UIViewController <MyModalViewControllerDelegate>

MyPresentingViewController.m

myModal.delegate = self;
- (void)myModalDidFinishDismissing {
    //do something
    [tableView reloadData];
}

答案 1 :(得分:1)

您可以在模态表单类中拥有委托变量。当您关闭模态窗体时,可以调用[delegate performSelector:@selector(modalFormClosed)]调用[tableView reloadData]。

@interface ModalForm : UIViewController
@property (nonatomic, weak) id delegate;
@end

@implementation ModalForm
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.delegate performSelector:@selector(modalFormClosed)];
}
@end

在您使用ModalForm的课程中:

myModalForm.delegate = self;

并确保你也有modalFormClosed方法:

- (void)modalFormClosed {
    [self.tableView reloadData];
}

或者,当您的模态表单消失时,您可以发送NSNotification(查看NSNotificationCenter)。

答案 2 :(得分:1)

我希望我有参考,但几年前我看到苹果公司的一张纸条说,模态观点永远不应该自省。而是在呈现视图控制器上调用方法。在此方法中,演示者解除模态视图控制器。通常我在我的UIViewControllers上放了一个类别:

@interface UIViewController (Extension)
-(void)simpleDismissAnimated:(BOOL)animated;
@end
@implementation UIViewController (Extension)
-(void)simpleDismissAnimated:(BOOL)animated {
[self dismissViewControllerAnimated:animated completion:nil];
}

将其包含在所有视图控制器子类中或pch文件中。

所以你的模态视图控制器调用:

[self.presentingViewController simpleDismissAnimated:YES];

然后在你的呈现视图控制器中,覆盖simpleDismissAnimated的实现:如下所示:

-(void)simpleDismissAnimated:(BOOL)animated {
[_tableView reloadData];
[self dismissViewControllerAnimated:animated completion:nil;
}

应该照顾它。

答案 3 :(得分:0)

试试这一行:

 [self.tableView reloadData];

答案 4 :(得分:0)

您可以尝试将[tableView reloadData]放在tableView所在的viewWillAppear方法中。

答案 5 :(得分:0)

我遇到了同样的问题。 ReloadData不起作用。我解决了它,所以我做了这样的新方法:

- (void)insertNewString:(NSString *)text{
        if (!_yourArrayWithData) {
            _yourArrayWithData = [[NSMutableArray alloc] init];
        }
        [_yourArrayWithData insertObject:text atIndex:0];
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }

当我想向tableView添加内容时,我使用按钮,其行为如下:

- (IBAction)SaveNewPhrase:(id)sender {        
NSString *mainText = _NewPhraseTextView.text;   //I take nsstring from textView

if([mainText isEqual:@""]){
    return;
}else{
    NSMutableArray *contentFile = [NSArray arrayWithContentsOfFile:docPathContents()];
    NSMutableArray *copyContentFile = [[NSMutableArray alloc] init];

          //save array with new item        
    [copyContentFile addObject:mainText];
    [copyContentFile addObjectsFromArray:contentFile];
    [copyContentFile writeToFile:docPathContents() atomically:YES];   

    [self insertNewString:mainText];      //refresh tableView

    [_NewPhraseTextView resignFirstResponder];
}}

我希望,这有帮助。