- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有 UIImage 内容的自定义单元格 UIButton,带有目标操作选择器 pushToImageDetailViewController: 它将 View 推送到图像的另一个详细 View 。我在他的委托(delegate)方法中从 UIPickerView 创建单元格,然后我在服务器上上传图像,然后存储到文档路径库。我需要在自定义单元格 attachmentId 上编辑属性,这就是问题所在。
- (void)pushToImageDetailViewController:(id)sender
{
[MessageLoader invalidate];
[self.messageInputFieldView resignFirstResponder];
while (sender && ![sender isKindOfClass:[MessageTableViewCell class]]) {
sender = [sender superview];
}
if (!sender) {
NSLog(@"Error by getting cell from superview of button");
} else {
MessageTableViewCell *cell = (MessageTableViewCell *) sender;
ImageDetailViewController *imageDetailView = [[ImageDetailViewController alloc] init];
imageDetailView.sender = cell.sender;
imageDetailView.attachmentId = cell.attachmentId;
[[self navigationController] pushViewController:imageDetailView animated:YES];
}
}
这段代码我在 block 中,因此自身属性上有 weakSelf,重要的是刷新单元格语句,indexPathForRow 触发了 cellForRowAtIndexPath,在这条消息中我有 NSLog 和正确的 ID进入这个消息。
NSMutableDictionary *messagesFromCollection = [weakSelf.messageDetailViewController.messages objectAtIndex:weakSelf.index];
[[[messagesFromCollection objectForKey:@"attachments"] firstObject] setObject:[fileId copy] forKey:@"id"];
// refresh concret cell
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:weakSelf.index inSection:0];
[weakSelf.messageDetailViewController.messagesTableView reloadRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationNone];
在 cellForRowAtIndex 中,将 self.messages 中的 ID、字典数组集合分配给单元格属性 attachmentId,但在 pushToImageDetail 中,我在预生成之前有旧 ID。
cell.attachmentId = [attachmentInfo objectForKey:@"id"];
[cell.attachmentView addTarget:self action:@selector(pushToImageDetailViewController:) forControlEvents:UIControlEventTouchUpInside];
[cell.attachmentView setImage:attachmentImage forState:UIControlStateNormal];
[cell.bgImageView addSubview:cell.attachmentView];
[cell.contentView addSubview:cell.attachmentView];
问题是 imageDetailView.attachmentId = cell.attachmentId 中的 id 分配了旧的 id(带有图像 id 的错误绑定(bind)图像细节),而在 cellForRow 中是新的实际 cell.attachmentId = [attachmentInfo objectForKey:@"id"]。我不知道这怎么可能。
这里是 cellForRow:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
NSDictionary *messagesFromDictionary = [self.messages objectAtIndex:indexPath.row];
NSString *message = [messagesFromDictionary objectForKey:@"message"];
UIImage *attachmentImage = [self.attachments objectAtIndex:indexPath.row];
NSString *time = [NSString formattedTime:[messagesFromDictionary objectForKey:@"posted_date"]];
NSString *beforeSender = [self beforeSender:indexPath];
static NSString *CellIdentifier;
if ([message isEqualToString:@""]) {
CellIdentifier = @"AttachmentCellIdentifier";
} else {
CellIdentifier = @"MessageCellIdentifier";
}
MessageTableViewCell *cell = (MessageTableViewCell *)
[self.messagesTableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil) {
cell = [[MessageTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
cell.sender = [messagesFromDictionary objectForKey:@"user_id"];
cell.backgroundColor = [UIColor clearColor];
UIImage *bgImage = nil;
UIImage *arrowImage = nil;
CGRect messageFrame = {};
CGRect bgImageFrame = {};
CGRect profilePictureFrame = {};
CGRect timeFrame = {};
CGRect arrowFrame = {};
// Log message level 3
//[NSString LogMessages:[NSString stringWithFormat:@"S:%f, %f M: %@", messageFrame.size.width, messageFrame.size.height, message] :3];
/*
!!!! width and height for all cells !!!!
*/
cell.timeLabel.text = [NSString stringWithFormat:@"%@", time];
[cell.timeLabel sizeToFit];
timeFrame.size.height += cell.timeLabel.frame.size.height; // MUST BE DEFINED BEFORE Y COORDINATE
timeFrame.size.width += cell.timeLabel.frame.size.width;
profilePictureFrame.size.width += AVATAR;
profilePictureFrame.size.height += AVATAR;
if ([CellIdentifier isEqualToString:@"MessageCellIdentifier"]) {
cell.messageContentView.text = message;
CGSize textSizeFrame = { 320.0 - 5*PADDING - AVATAR - cell.timeLabel.frame.size.width - RESERVE - 12, CGFLOAT_MAX};
messageFrame.size = [message sizeForText:textSizeFrame withFontSize:MESSAGE_FONTSIZE];
messageFrame.size.width += RESERVE;
messageFrame.origin.x += PADDING;
messageFrame.origin.y += PADDING;
bgImageFrame.origin.y += PADDING;
bgImageFrame.size.width = messageFrame.size.width + 3*PADDING + cell.timeLabel.frame.size.width;
bgImageFrame.size.height += messageFrame.size.height + 2*PADDING;
arrowFrame.size.width += MESSAGE_ARROW_WIDTH;
arrowFrame.size.height += MESSAGE_ARROW_HEIGHT;
arrowFrame.origin.y += bgImageFrame.size.height/2;
profilePictureFrame.origin.y += PADDING;
// must be defined after bgImageFrame height, timeFrame height
timeFrame.origin.y += bgImageFrame.size.height/2 - cell.timeLabel.frame.size.height/2;
// must be defined after messageFrame width
timeFrame.origin.x += messageFrame.size.width + PADDING;
} else if ([CellIdentifier isEqualToString:@"AttachmentCellIdentifier"]) {
// prepare fields to download attachment from server
NSArray *attachmentsFromDict = [messagesFromDictionary objectForKey:@"attachments"];
NSDictionary *attachmentInfo = [attachmentsFromDict objectAtIndex:0];
NSLog(@"id from cell %@", [attachmentInfo objectForKey:@"id"]);
cell.attachmentId = [attachmentInfo objectForKey:@"id"];
bgImageFrame.size.height = attachmentImage.size.height;
bgImageFrame.size.width = attachmentImage.size.width;
timeFrame.origin.y += PADDING;
// must be defined after bgImageFrame width, timeFrame width
timeFrame.origin.x += bgImageFrame.size.width/2 - timeFrame.size.width/2;
[cell.attachmentView addTarget:self action:@selector(pushToImageDetailViewController:) forControlEvents:UIControlEventTouchUpInside];
[cell.attachmentView setImage:attachmentImage forState:UIControlStateNormal];
cell.attachmentView.tag = indexPath.row;
[cell.bgImageView addSubview:cell.attachmentView];
[cell.contentView addSubview:cell.attachmentView];
}
// X, Y positions
if ([cell.sender isEqualToString:[[user userInfo] objectForKey:@"id"]]) { // left aligned (Sender)
bgImageFrame.origin.x = 320 - bgImageFrame.size.width - PADDING;
bgImage = [UIImage imageNamed:@"msg_sender.png"];
arrowFrame.origin.x += 320 - PADDING - 2;
arrowImage = [UIImage imageNamed:@"sender_arrow.png"];
cell.messageContentView.backgroundColor = [UIColor whiteColor];
cell.timeLabel.backgroundColor = [UIColor whiteColor];
} else { // right aligned (Receiver)
bgImageFrame.origin.x += AVATAR + 2*PADDING;
bgImage = [UIImage imageNamed:@"msg_receiver.png"];
arrowFrame.origin.x += AVATAR + 2*PADDING - MESSAGE_ARROW_WIDTH + 2;
arrowImage = [UIImage imageNamed:@"receiver_arrow.png"];
profilePictureFrame.origin.x += PADDING;
cell.messageContentView.backgroundColor = [UIColor colorWithRed:255/255.0 green:242/255.0 blue:254/255.0 alpha:1];
cell.timeLabel.backgroundColor = [UIColor colorWithRed:255/255.0 green:242/255.0 blue:254/255.0 alpha:1];
}
if ([CellIdentifier isEqualToString:@"AttachmentCellIdentifier"]) {
cell.attachmentView.frame = CGRectMake(IMAGE_WIDTH_PADDING + bgImageFrame.origin.x,
IMAGE_TOP_PADDING + timeFrame.size.height,
bgImageFrame.size.width - 2*IMAGE_WIDTH_PADDING,
bgImageFrame.size.height - IMAGE_BOTTOM_PADING - timeFrame.size.height);
}
if (
(![cell.sender isEqualToString:beforeSender]) &&
(![cell.sender isEqualToString:[[user userInfo] objectForKey:@"id"]])
)
{
[cell.profilePicture setFrame:profilePictureFrame];
// ==== load user avatar
cell.profilePicture.layer.masksToBounds = YES;
float radius = AVATAR/2;
CAShapeLayer *circle = [CAShapeLayer layer];
circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(KAPPA, KAPPA, 2.0*radius, 2.0*radius)
cornerRadius:radius].CGPath;
[cell.profilePicture.layer setMask:circle];
cell.profilePicture.image = [user getMyContactAvatar:cell.sender :existingContacts];
[cell.contentView addSubview:cell.profilePicture];
} else {
cell.profilePicture.frame = CGRectZero;
cell.profilePicture.image = nil;
[cell.profilePicture removeFromSuperview];
}
cell.messageContentView.frame = messageFrame;
[cell.bgImageView setFrame:bgImageFrame];
cell.bgImageView.image = bgImage;
cell.timeLabel.frame = timeFrame;
cell.textLabel.numberOfLines = 0;
cell.arrowView.frame = arrowFrame;
cell.arrowView.image = arrowImage;
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
最佳答案
通过分配到 UIButton 上的标记属性 indexPath.row 来解决,但仍然不明白为什么我以前的方法不起作用。
- (void)pushToImageDetailViewController:(id)sender
{
[MessageLoader invalidate];
[self.messageInputFieldView resignFirstResponder];
UIButton *imageButton = (UIButton *)sender;
MessageTableViewCell *cell = (MessageTableViewCell *) [self tableView:self.messagesTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:imageButton.tag inSection:0]];
ImageDetailViewController *imageDetailView = [[ImageDetailViewController alloc] init];
imageDetailView.sender = cell.sender;
imageDetailView.attachmentId = cell.attachmentId;
[[self navigationController] pushViewController:imageDetailView animated:YES];
}
关于具有目标操作的单元格上的 iOS UIButton,单元格未在 (id)sender 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19926966/
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!