这与我的另一个问题有关,但是没有以有用的方式回答(当UITableView为空时的消息)。
我正在尝试显示一个UIImage图形,当它为空时,你没有在UITableView
上保存任何书签。我有NSNotification设置,以便在添加或删除书签时,会发送一条消息,以便更新UITableView。
我一直在尝试使用此代码。为什么这不起作用?
- (void)bookmarksChanged:(NSNotification*)notification
{
[self.tableView reloadData];
UIImageView* emptyBookmarks = [[UIImageView alloc] initWithFrame:CGRectMake(75, 100, 160, 57)];
emptyBookmarks.alpha = 1;
emptyBookmarks.image = [UIImage imageNamed:@"emptyBookmark.png"];
[self.view addSubview:emptyBookmarks];
[emptyBookmarks release];
if ([self.dataModel bookmarksCount] == 0)
{
emptyBookmarks.alpha = 1;
}
else
{
emptyBookmarks.alpha = 0;
}
}
我可能以错误的方式接近......但如果可以挽救,我做错了什么?
当我最初有一个空的书签表视图时,没有显示图像。添加书签然后将其删除后,图像显示。 Grrh。
答案 0 :(得分:3)
另一种方法(和IMO正确的方法)来操作UITableView上的backgroundView属性。
虽然使用自定义图像单元制作单个单元格肯定会起作用,但我认为它过分复杂了UITableViewController数据源的逻辑。感觉就像一块垃圾。
根据UITableView文档:
A table view’s background view is automatically resized to match the
size of the table view. This view is placed as a subview of the table
view behind all cells , header views, and footer views.
Assigning an opaque view to this property obscures the background color
set on the table view itself.
虽然您可能不想将其设置为UIImageView,但很容易制作包含您想要的UIImageView的UIView。
答案 1 :(得分:0)
您确定[self.dataModel bookmarksCount]
等于0吗?
答案 2 :(得分:0)
首先,如果您要这样做,您需要在更新图像或模型等之后重新加载tableView,而不是之前。 但是你可能会让事情变得比他们需要的更复杂! 为什么不检查第0部分和indexPath.row 0的数据是否为空,如果是,则在cellForRowAtIndexPath中显示相应的文本消息。
//首先确保即使dataModel为空,也总会返回一行。
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSInteger numRows = 0;
if ([self.dataModel lastObject]) {
// Return the number of rows in the section.
numRows = [self.dataModel count]; // etc.
}
if (numRows < 1) numRows = 1;
return numRows;
}
//如果有数据则显示数据,否则显示空的消息。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
if ([self.dataModel lastObject]) {
// setup the cell the normal way here.
} else { // the datasource is empty - print a message
cell.textLabel.text = nil;
cell.detailTextLabel.text = NSLocalizedString(@"You haven't saved any bookmarks", @"");
cell.detailTextLabel.textColor = [UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:0.7];
cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;
}
答案 3 :(得分:0)
虽然我同意你可能会采取错误的方式,但
您的图片已分配并添加到您更改的书签中,当最初没有书签时,您的通知不会触发。因此,您没有看到图像。当您的表格视图显示或显示时,请调用bookmar。
答案 4 :(得分:0)
实现此目的的最佳方法可能是在您的numberOfRowsInSection方法中执行检查,以便在数据源为空时返回1。然后在cellForRowAtIndexPath中检查您的数据源是否为空,如果是,则创建一个包含您想要的任何内容的自定义单元格。在heightForRowAtIndexPath中,如果数据源为空,则需要返回自定义单元格高度,但前提是您希望单元格大于默认值。至少这就是我接近它的方式。
答案 5 :(得分:0)
当书签计数为零时,在行方法中添加一个:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
int c;
c = bookmarks.count;
if(c == 0){
c = 1;
}
return c;
}
然后再次检查你的cellforrowatindexpath。
答案 6 :(得分:0)
在这种情况下需要注意的另一件事是,如果您正在使用核心数据并且数据源正在以实体为基础,那么您需要确保模型匹配。在某些情况下,你可能会得到一些奇怪的副作用行为。如果您允许编辑并且核心数据具有空模型但是您的tableview仍然显示单元格,则尤其如此。