我在UIView中嵌入了一个UITableView,我无法弄清楚如何更新。当我在UIView中嵌入UITableView来到这个页面时,有一个按钮,当按下时会弹出一个modalForm。有一个textField,用户输入一个名称,然后按下另一个按钮来“创建”该对象,关闭modalForm,并更新应用程序数据。但是,我不确定如何刷新我的UITableView数据...当modalForm视图被解除时,有没有办法告诉UITableView刷新?
编辑:我知道我需要发送此消息[tableView reloadData];
才能刷新,但我想知道我可以把它放在哪里以便在解雇modalForm时调用它?
答案 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];
}}
我希望,这有帮助。