我现在已经在这里待了大约3个小时了,我终于全力以赴了。在我看来,我有2 UITableView
,其中一个是发表评论的论坛板,什么不是,第二个UITableView
用于提及人。我遇到的问题是即使我只想更新其中一个表格视图,tableview counts
也会受到影响。
我在viewdidload
self.mentionTableView.delegate = self;
self.mentionTableView.dataSource = self;
self.mentionTableView.tag = 1;
self.forumTable.delegate = self;
self.forumTable.dataSource = self;
self.forumTable.tag = 2;
如果我实际上没有加载feedArray
forumTable
获取其数据的位置,则提及部分可以正常工作。我已经发现,如果matchedNames.count
< feedArray.count
一切正常,但如果matchedNames.count
> feedArray.count
它崩溃了,这就是我得到的错误
-[__NSCFArray objectAtIndex:]: index (1) beyond bounds (1)
这意味着feedArray
中只有1个项目,而matchedNames
只有一个项目。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
我已经使用这些代码试图让它工作但仍然没有,我甚至完成了它们的组合。
1)
if ([tableView isEqual: mentionTableView]){
NSLog(@"%@",matchedNames);
NSLog(@"%i",matchedNames.count);
return [matchedNames count];
} else if([tableView isEqual:forumTable]){
return [feedArray count];
}
2)
if (tableView == mentionTableView){
NSLog(@"%@",matchedNames);
NSLog(@"%i",matchedNames.count);
return [matchedNames count];
} else if(tableView == commentTable){
return [feedArray count];
}
3)
if (tableView.tag == 1){
NSLog(@"%@",matchedNames);
NSLog(@"%i",matchedNames.count);
return [matchedNames count];
} else if(tableView.tag == 2){
return [feedArray count];
}
我知道我没有做else if
,但我只是想特定一点,以避免这个问题。
这是我的cellForRowAtIndexPath
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (tableView.tag == 1){
CGAffineTransform transform = CGAffineTransformMakeRotation(3.14);
static NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.transform = transform;
cell.textLabel.text = [self.matchedNames objectAtIndex:indexPath.row];
return cell;
} else {
static NSString *CellIdentifier = @"commentCell";
commentsCustomCell *cell =(commentsCustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[commentsCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
NSDictionary *feedPost = [feedArray objectAtIndex:indexPath.row];
NSString *checkIFempty = [feedPost objectForKey:@"isForum_empty"];
if (![checkIFempty isEqualToString:@"1"]) {
cell.noCommentsLabel.text = nil;
} else {
cell.noCommentsLabel.text = @"No Comments";
cell.forumComment = nil;
}
NSString *username =[feedPost objectForKey:@"Username"];
NSString *final_time =[feedPost objectForKey:@"final_time"];
NSString *userIDforPic =[feedPost objectForKey:@"UserID"];
finalComment = [feedPost objectForKey:@"comment"];
cell.forumComment.text = finalComment;
return cell;
}
}
如果我的问题令人困惑我道歉,我已经睡了36个小时了。谢谢你看我的问题!
答案 0 :(得分:2)
你真的应该考虑重构代码并在不同的viewControllers中分离这两个tableView。
例如,您可以在主viewController中使用containerViews,并将tableview放在容器视图控制器中。
TableView委托使用大量代码,并且将不同的tableView设置为同一个控制器将总是这样结束,弄乱代码并给出比应有的更多麻烦。
答案 1 :(得分:1)
您可以使用一些技术来帮助清理代码并减少混乱的解决方案。我会煞费苦心地解释一下。
一个简单的步骤就是创建一个属性或方法,根据tableView或标记为您提供数据数组:
- (NSArray *)dataForInteger:(NSUInteger)value {
return @[self.matchedNames, self.feedArray][value];
}
// you can also make this a readonly property for easier access
要使用上述方法,您需要确保需要matchedNames
的表格的标记为0
且feedArray
为1
(或者您可以使用一个简单的if/else
语句,并根据需要制作标签。
现在看看这将使你未来的逻辑变得多么容易!
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
[[self dataForInteger:tableView.tag] count];
}
就是这样!
接下来,您可以创建一个方法,如:
- (UITableViewCell *)emptyCellForTableView:(UITableView *)tableView {
NSString *cellIdentifier = @[@"CellIdentifierONe", @"CellIdentifierTWO"][tableView.tag];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
// the only messy looking logic
if (!tableView.tag) { // tableView.tag == 0
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
CGAffineTransform transform = CGAffineTransformMakeRotation(3.14);
cell.transform = transform;
} else {
// make sure "CommentsCustomCell" is a class and not an instance (like your example)
cell = [[CommentsCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
}
return cell;
}
然后在tableView:cellForRowAtIndexPath:
:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [self emptyCellForTableView:tableView];
NSArray *dataArray = [self dataForInteger:tableView.tag];
// setup all custom UITableViewCell's to have a property or setter "data"
if ([cell respondsToSelector:@selector(setData:)]) {
// I will explain this a bit later
cell.data = dataArray[indexPath.row];
} else {
// based on your example this was an NSString array
self.textLabel.text = dataArray[indexPath.row];
}
}
现在cell.data = dataArray[indexPath.row];
是每个Apple的示例如何自定义UITableViewCells
的设置数据。只需创建一个名为data的属性,接受它的setter就像这样(对于你的例子):
// CommentsCustomCell.m
- (void)setData:(id /*or custom class, in this case you use NSDictionary*/)data {
_data = data;
// NTOE: I just copied your example above, I am sure there is a nicer way to do this but you get the idea.
NSDictionary *feedPost = (NSDictionary *)data;
NSString *checkIFempty = [feedPost objectForKey:@"isForum_empty"];
if (![checkIFempty isEqualToString:@"1"]) {
cell.noCommentsLabel.text = nil;
} else {
cell.noCommentsLabel.text = @"No Comments";
cell.forumComment = nil;
}
NSString *username =[feedPost objectForKey:@"Username"];
NSString *final_time =[feedPost objectForKey:@"final_time"];
NSString *userIDforPic =[feedPost objectForKey:@"UserID"];
finalComment = [feedPost objectForKey:@"comment"];
cell.forumComment.text = finalComment;
}
这样的解决方案如此美丽的原因是,如果您想要使用不同的自定义UITableViewCell
,您需要做的就是更改空单元格创建方法以创建该类,这基本上是它(这也允许您将所有单元格的IBOutlet
私有化!)。只要新类具有data
属性,您的主控制器就不关心了!它只是通过发送数据。这也允许您适当地缩放它。如果所有tableView
使用自定义单元格,您可以轻松地在同一viewController
中拥有十几个表视图,而无需额外的逻辑(只需将其添加到数组中,设置标记,并确保创建单元格)方法创建适当的单元格!)。
我很快就输入了这个,所以可能有一些缺失的逻辑或拼写错误。如果他们被指出我会解决任何问题。祝你好运。