用 NSObject 替换 NSMutableArray 并在 UITableView 中读取它
Posted
技术标签:
【中文标题】用 NSObject 替换 NSMutableArray 并在 UITableView 中读取它【英文标题】:Replacing NSMutableArray with NSObject and reading it in a UITableView 【发布时间】:2013-01-14 07:58:08 【问题描述】:我正在努力做到这一点,以便当我在 picherWheel 上选择一艘船的所有者时,我将他们的船放在 tableView 中。目前,我正在通过在选择器上提供带有 if-else 系列的 NSMutableArray 来做到这一点,就像这样
-(void)updatePicker
NSString *boatsFromOwner = [boatOwners objectAtIndex:[shipOwners selectedRowInComponent:0]];
boatsForOwner = [[NSMutableArray alloc] init];
if ([boatsFromOwner isEqualToString:@"Owner1"])
[self.boatsForOwner addObject:@"Titanic1"];
[self.boatsForOwner addObject:@"Titanic2"];
[self.boatsForOwner addObject:@"Titanic3"];
[self.boatsForOwner addObject:@"Titanic4"];
[self.boatsForOwner addObject:@"Titanic5"];
[self.boatsForOwner addObject:@"Titanic6"];
[self.boatsForOwner addObject:@"Titanic7"];
if ([boatsFromOwner isEqualToString:@"Owner2"])
[self.boatsForOwner addObject:@"Titanic1"];
[self.boatsForOwner addObject:@"Titanic2"];
[self.boatsForOwner addObject:@"Titanic3"];
然后像这样将其读取到 tableView 中:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [boatsForOwner count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *simpleTableIdentifier = @"SimpleTableCell";
SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
cell.nameLabel.text = [boatsForOwner objectAtIndex:indexPath.row];
cell.moreInfoLabel.text = [boatsForOwner objectAtIndex:indexPath.row];
return cell;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
UITableViewCell *cell = [self.boatsTableView cellForRowAtIndexPath:indexPath];
[self performSegueWithIdentifier:@"boatInfoSegue" sender:cell];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
现在,这工作正常。但我认为使用 NSObjects 来存储有关船只的信息会很聪明,因为我将在多个地方需要它。所以我做了一些船对象,像这样:
cargoShips* Titanic = [[cargoShips alloc]init];
Titanic.name = @"Titanic1";
Titanic.size = @"1000";
Titanic.owner = @"Owner1";
cargoShips* Titanic2 = [[cargoShips alloc]init];
Titanic2.name = @"Titanic2";
Titanic2.size = @"2000";
Titanic2.owner = @"Owner2";
这可以正确记录并且效果很好。这是第一个问题:
1) 如何将 pickerWheel 上的对象链接到 *.owner,所以当我在***上选择“Owner1”时,我会得到所有带有 *.owner = @"Owner1"
标记的船?
2)如何使用这些船的 *.name 填充 UITableView?
3) 而当表中加载了这些对象时,我怎样才能向目标视图发送消息关于发送什么对象呢?
提前致谢
【问题讨论】:
【参考方案1】:它非常简单直接..只需使用您创建的 CargoShips 类的对象..然后这样做..
-(void)updatePicker
NSString *boatsFromOwner = [boatOwners objectAtIndex:[shipOwners selectedRowInComponent:0]];
boatsForOwner = [[NSMutableArray alloc] init];
if ([boatsFromOwner isEqualToString:@"Owner1"])
cargoShips* Titanic = [[cargoShips alloc]init];
Titanic.name = @"Titanic1";
Titanic.size = @"1000";
Titanic.owner = @"Owner1";
[self.boatsForOwner addObject:Titanic];
Titanic = [[cargoShips alloc]init];
Titanic.name = @"Titanic2";
Titanic.size = @"2000";
Titanic.owner = @"Owner2";
[self.boatsForOwner addObject:Titanic];
Titanic = [[cargoShips alloc]init];
Titanic.name = @"Titanic3";
Titanic.size = @"3000";
Titanic.owner = @"Owner3";
[self.boatsForOwner addObject:Titanic];
else if ([boatsFromOwner isEqualToString:@"Owner2"])
cargoShips* Titanic = [[cargoShips alloc]init];
Titanic.name = @"Titanic1";
Titanic.size = @"1000";
Titanic.owner = @"Owner1";
[self.boatsForOwner addObject:Titanic];
Titanic = [[cargoShips alloc]init];
Titanic.name = @"Titanic2";
Titanic.size = @"2000";
Titanic.owner = @"Owner2";
[self.boatsForOwner addObject:Titanic];
在 TableView 委托函数中,您可以使用以下代码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *simpleTableIdentifier = @"SimpleTableCell";
SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
cargoShips* Titanic=[boatsForOwner objectAtIndex:indexPath.row];//You can get the object reference like this
cell.nameLabel.text = Titanic.name;
cell.moreInfoLabel.text = Titanic.owner;
return cell;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
cargoShips* Titanic=[boatsForOwner objectAtIndex:indexPath.row]; //Use the Titanic object for further processing..
UITableViewCell *cell = [self.boatsTableView cellForRowAtIndexPath:indexPath];
[self performSegueWithIdentifier:@"boatInfoSegue" sender:cell];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
【讨论】:
“泰坦尼克号”变量,你能再深入一点吗?否则很棒的答案,但我不太明白那部分。假设我有一个目标视图,其中包含大小、名称和所有者三个标签。我可以直接说nameLabel.text = @"%@", Titanic.name;
和 Titanic.name 将是我在表格中选择的那个吗?
使用数组中添加的对象即可。假设您想通过选择屏幕上的表格单元格来显示信息,您将使用 tableview didselect 并从那里您将获得添加到数组中的特定对象,例如 cargoShips* Titanic=[boatsForOwner objectAtIndex:indexPath.row];现在,如果您在当前控制器之外定义了视图,只需使用对象 Titanic 来显示描述,或者您可以声明一个全局变量,比如 cargoShips* selectedTitanic; & 可以这样使用 self.selectedTitanic=[boatsForOwner objectAtIndex:indexPath.row];顺便说一句,如果你喜欢我的回答,你可以投票..以上是关于用 NSObject 替换 NSMutableArray 并在 UITableView 中读取它的主要内容,如果未能解决你的问题,请参考以下文章
NSObject 用 nib 加载 UIView 但文件所有者是 UIViewController
无法使 NSPredicate 在自定义 NSObject 上工作
-[NSObject(NSObject) doesNotRecognizeSelector:] 调用时崩溃 -[ViewController prepareForSegue:sender:]