我有班级LearnfestItem.h
:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface LearnfestItem : NSObject
@property (strong, nonatomic) NSString * itemId;
@property (strong, nonatomic) NSString * itemTitle;
@property (strong, nonatomic) NSString * itemDescription;
@property (strong, nonatomic) NSString * itemContent;
@property (strong, nonatomic) NSString * itemType;
@property (strong, nonatomic) UIImage * itemImage;
@property (strong, nonatomic) NSDate * itemRegistered;
-(id)initWithData:(NSDictionary *)data andImage:(UIImage *)image;
@end
&安培; Object.m
:
#import "LearnfestItem.h"
#import "Defaults.h"
@implementation LearnfestItem
-(id)init
{
self = [self initWithData:nil andImage:nil];
return self;
}
-(id)initWithData:(NSDictionary *)data andImage:(UIImage *)image
{
self = [super init];
self.itemId = data[ITEM_ID];
self.itemTitle = data[ITEM_TITLE];
self.itemDescription = data[ITEM_DESCRIPTION];
self.itemContent = data[ITEM_CONTENT];
self.itemType = data[ITEM_TYPE];
self.itemImage = image;
self.itemRegistered = data[ITEM_REGISTERED];
return self;
}
@end
在我的UIViewController
我有一个UITableView
,在NSMutableArray
方法中创建了LearnfestItems
cellForRowAtIndexPath
:
LearnfestItem * createLearnfestItem = [[LearnfestItem alloc] initWithData:learnfestItemDictionary andImage:learnfestItemImage];
NSLog(@"Insert learnfest item with id: %@ at index %li", createLearnfestItem.itemId, (long)row);
[self.learnfestItemObjects insertObject:createLearnfestItem atIndex:row];
在didSelectRowAtIndexPath
我希望收到LearnfestItem
NSMutableArray
的{{1}}致电:
self.selectedLearnfestItem = [self.learnfestItemObjects objectAtIndex:indexPath.row];
然后我想将它发送到另一个视图控制器,以便在prepareForSegue
segement中显示我执行此操作的数据:
LearnfestItemViewController * learnfestVC = [segue destinationViewController];
NSLog(@"Sending learnfest item with id: %@", self.selectedLearnfestItem.itemId);
learnfestVC.item = self.selectedLearnfestItem;
当我尝试访问LearnfestItem's
中的cellForRowAtIndexPath
个媒体资源时。我得到的只是空...在我的其他表格视图委托方法等等。任何人都可以发现我做错了什么?感谢
答案 0 :(得分:0)
您显示的代码缺少所有错误和有效性检查。使用 NSAssert()和 item.length / item.count 检查时,您将知道发生了什么。
但是,根据您的代码,我建议两件事:
我的猜测是所有内容都已正确初始化,但之后数据会消失。
例如:
@property (nonatomic, copy) NSString * itemId; // Safe
@property (nonatomic, strong) NSString * itemId; // Not safe
当您的属性类具有可变变量(例如NSString与NSMutableString与MyMutableString)时,复制更安全。使用strong将创建一个指向原始数据的指针,这可能是一个可变实例,之后可能会被修改。使用strong将始终指向原始数据,即使它已被更改。
第二部分:
learnfestVC.item = self.selectedLearnfestItem;
您的LearnfestItemViewController包含一些与LearnfestItem类相关的属性。确保它也是副本。使用segues时,调用对象经常会消失。 确保您的新控制器具有所有所需数据的本地副本(或使用协议代理,但这需要更长时间的讨论)
答案 1 :(得分:0)
添加错误和数据有效性检查将使您的任务变得更加容易。而不是试图弄清楚为什么某些东西不起作用,当你的东西不像你期望的那样时,你会得到通知。
这是您的代码快速而肮脏的“维护”。你应该从中得到的是一些想法,检查什么,在哪里以及如何。在正常情况下这是矫枉过正,但现在你有一个神秘的问题,需要找到它。这可能是艰苦而单调的工作。
@import Foundation;
@import UIKit;
@interface LearnfestItem : NSObject
@property (copy, nonatomic) NSString *itemId;
@property (copy, nonatomic) NSString *itemTitle;
@property (copy, nonatomic) NSString *itemDescription;
@property (copy, nonatomic) NSString *itemContent;
@property (copy, nonatomic) NSString *itemType;
@property (strong, nonatomic) UIImage *itemImage;
@property (strong, nonatomic) NSDate *itemRegistered;
- (instancetype)initWithData:(NSDictionary *)data andImage:(UIImage *)image;
@end
Object.m:
#import "Defaults.h"
#import "LearnfestItem.h"
@implementation LearnfestItem
- (instancetype)init
{
self = [self initWithData:nil andImage:nil];
return self;
}
- (instancetype)initWithData:(NSDictionary *)data andImage:(UIImage *)image
{
NSAssert(data.length, @"My Assert: missing data");
NSAssert(image, @"My Assert: missing image");
if ((self = [super init]))
{
// TODO: nil ok, if doesn't exist?
_itemId = data[ITEM_ID];
_itemTitle = data[ITEM_TITLE];
_itemDescription = data[ITEM_DESCRIPTION];
_itemContent = data[ITEM_CONTENT];
_itemType = data[ITEM_TYPE];
_itemImage = image;
_itemRegistered = data[ITEM_REGISTERED];
}
return self;
}
@end
“(原始文本)在我的UIViewController中,我有一个UITableView,它在cellForRowAtIndexPath方法中创建了一个了解LearnfestItems的NSMutableArray:”
NSAssert(learnfestItemDictionary.count, @"My Assert: missing dict");
NSAssert(learnfestItemImage, @"My Assert: missing image");
LearnfestItem *createLearnfestItem = [[LearnfestItem alloc] initWithData:learnfestItemDictionary andImage:learnfestItemImage];
NSLog(@"Insert learnfest item with id: %@ at index %@", createLearnfestItem.itemId, @(row));
NSAssert(createLearnfestItem, @"My Assert: missing item");
NSAssert(self.learnfestItemObjects.count > row, @"My Assert: learnfestItemObjects");
self.learnfestItemObjects[row] = createLearnfestItem;
“(原文)关于didSelectRowAtIndexPath我想从NSMutableArray接收LearnfestItem我这样做是通过调用:”
NSAssert(self.learnfestItemObjects.count > indexPath.row, @"My Assert: learnfestItemObjects");
self.selectedLearnfestItem = self.learnfestItemObjects[indexPath.row];
“(原文)然后我想将它发送到另一个视图控制器,以在prepareForSegue段中显示我这样做的数据:”
LearnfestItemViewController *learnfestVC = (LearnfestItemViewController *)[segue destinationViewController];
NSLog(@"Sending learnfest item with id: %@", self.selectedLearnfestItem.itemId);
learnfestVC.item = self.selectedLearnfestItem;