我是iOS编程的新手。我有一个问题,我在谷歌和这个页面搜索过但我找不到答案。
我想构建一个简单的联系人演示。它有2个视图
第一个视图,我有一个带有空数据的UITableView和一个Add按钮。当我点击添加按钮时,它将出现第二个视图
第二个视图,它有表格和1个保存按钮。在我填写表单后,单击“保存”按钮,我希望它更新为UITableView的单元格,但它不起作用。
抱歉我的英语不好,希望你能理解
这是我的代码: 首先,将Contact.h存档以存储数据
#import <Foundation/Foundation.h>
@interface Contact : NSObject{
}
@property(strong, nonatomic) NSString *name;
@property(strong, nonatomic) NSString *phoneNumber;
@property(strong, nonatomic) NSString *company;
@property(strong, nonatomic) NSString *email;
@property(strong, nonatomic) NSString *address;
@end
单击“保存”按钮(在第二个视图中)处理事件:
- (IBAction)saveButton:(id)sender
{
Contact *c = [[Contact alloc] init];
c.name = self.nameText.text;
c.company = self.comText.text;
c.phoneNumber = self.phoneText.text;
c.email = self.emailText.text;
c.address = self.addressText.text;
/*telephoneViewController is a class that store my TableView ( it is the first view)
*/
TelephoneViewController *tv = [[TelephoneViewController alloc] init];
tv.dataObj = [[NSMutableArray alloc]init];
[tv.tableView beginUpdates];
[tv.dataObj addObject:c];
[tv.tableView insertRowsAtIndexPaths:tv.dataObj withRowAnimation:
UITableViewRowAnimationRight];
[tv.tableView endUpdates];
[tv.tableView reloadData];
// back to first view ( UITableView view)
[self.navigationController popViewControllerAnimated:YES];
}
这是我的第一个观点: // dataObj是NSMutableArray,我创建它来存储联系人数据然后我用它在UITableView中显示
- (void) viewWillAppear:(BOOL)animated
{
[self.tableView reloadData];
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.dataObj = [[NSMutableArray alloc]init];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.dataObj count];
}
- (UITableViewCell* )tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if(cell==nil){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
cell.textLabel.text = [self.dataObj objectAtIndex:indexPath.row];
return cell;
}
//handle when click add button
- (IBAction)addButton:(id)sender
{
//go to second view ( view to fill out form)
ContactViewController *vc = [[ContactViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
}
UPDATE // ====================================
在My FirstView中,我添加了2个方法。但是它会出现异常(或错误):
- [联系行]:无法识别的选择器发送到实例0x8c46610 2014-04-01 22:10:43.750 TelephoneDemo [463:70b] * 由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [联系行]:无法识别的选择器发送到实例0x8c46610'
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.dataObj = [[NSMutableArray alloc]init];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addContact:) name:@"didAddContact" object:nil];
}
- (void) addContact:(NSNotification *)notification
{
Contact *c = (Contact *) notification.object;
self.dataObj = [[NSMutableArray alloc]init];
[self.tableView beginUpdates];
[self.dataObj addObject:c];
[self.tableView insertRowsAtIndexPaths:self.dataObj withRowAnimation:UITableViewRowAnimationRight];
[self.tableView endUpdates];
[self.tableView reloadData];
}
答案 0 :(得分:0)
答案 1 :(得分:0)
这里你出错了。
/*telephoneViewController is a class that store my TableView ( it is the first view)
*/
TelephoneViewController *tv = [[TelephoneViewController alloc] init];
tv.dataObj = [[NSMutableArray alloc]init];
您不应该创建TelephoneViewController
的新实例。因为它与您来自的视图控制器不同。为简单起见,我将向您解释,假设您有两个视图控制器VC A
和VC B
。表单VC A
表示您正在通过推送转移到VC B
。在B
内,您正在创建VC A
的新实例(称为A1
)并设置其数组。然后回到VC A
。请参阅此处A
和A1
同一类的两个不同实例。因此,如果您为VC A
设置数据,VC A1
将如何获取数据。我希望你现在能得到它。这是大多数初学者常见的事情。
所以这里的解决方案是你应该遵循委托模式在视图控制器之间传递数据。
答案 2 :(得分:0)
检查Anil的答案,了解您的代码目前的错误。
以下是如何让事情发生变化。
在您的第一个ViewController的init
或viewDidLoad
方法中,使用NSNotificationCenter收听特定事件,例如:didAddNewContact
。代码看起来像:
[NSNotificationCenter defaultCenter] addObserver:self selector:@selector:(addContact:) name:@"didAddNewContact" object:nil];
在相同的ViewController的dealloc或类似方法中,您还应该删除self以观察该通知。
在你的第二个ViewController中,当用户点击保存按钮时,你只需执行类似这样的操作,而不是创建表的新实例:
Contact *c = [[Contact alloc] init];
c.name = self.nameText.text;
c.company = self.comText.text;
c.phoneNumber = self.phoneText.text;
c.email = self.emailText.text;
c.address = self.addressText.text;
[NSNotificationCenter defaultCenter] postNotificationName:@"didAddNewContact" object:c];
// back to first view ( UITableView view)
[self.navigationController popViewControllerAnimated:YES];
这里发生的是通知中心发出我们的第一个视图控制器将捕获的通知。
还记得我们何时开始收听通知?我们使用了选择器addContact:
。是时候实施了。
- (void)addContact:(NSNotification *)notification
{
// This is the same one the user created. Use this as required by the logic
Contact *c = (Contact *)notification.object;
// Now you can either reload the data by calling reloadData on the UITableView or use the insertRowsAtIndexPaths:withRowAnimation method.
//This assumes you have properly implemented the UITableView Datasource protocol methods in your view controller or elsewhere
NSInteger section = [self numberOfSectionsInTableView:tableView]-1;
NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:[self tableView:tableView numberOfRowsInSection:section] inSection:section];
[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
答案 3 :(得分:0)
使用委托,您可以获得解决方案。请看下面的代码,
在第二个控制器的.h文件中
@protocol PopOverViewControllerDelegate;
@interface PopOverViewController : UITableViewController
{
//Declare your variable
}
@property (nonatomic, weak) id<PopOverViewControllerDelegate> delegate;
@end
@protocol PopOverViewControllerDelegate <NSObject>
- (void)PopOverViewController:(PopOverViewController *)viewController
didChooseValue:(NSString *)value;
@end
在secondcontroller的.m文件中
id<PopOverViewControllerDelegate> strongDelegate = self.delegate;
[strongDelegate PopOverViewController:self didChooseValue:selection]; // selection means, your value to send back.
在firstcontroller的.h文件中声明popoverControllerDeleage,然后在firstcontroller的.m文件中声明
-(void)PopOverViewController:(PopOverViewController *)viewController didChooseValue:(NSString *)value
{
NSLog("%@",value);
}
答案 4 :(得分:-1)
您的代码看起来是正确的,只需确保在重新加载数据后调用tableview委托方法。