1

RoomItem 中是否需要一些重要的东西来确保不跳过此方法?这是我的详细视图控制器中的第一个,当我处于调试模式时它会不断被跳过。我确定我错过了一些简单得可笑的东西,但我已经盯着它看了好几个小时,就是不知道它是什么。

@interface DetailViewController ()
- (void)configureView;
@end
@implementation DetailViewController
- (void)setDetailItem:(RoomItem *)newDetailItem
{
    if (_detailItem != newDetailItem) {
        _detailItem = newDetailItem;

        // Update the view.
        [self configureView];
    }
}
- (void)configureView
{
// Update the user interface for the detail item.
if (self.detailItem) {
    [_roomTxt setText:[_detailItem room]];
    [_buildingTxt setText:[_detailItem building]];
    [_dateTxt setText:[self dateCreatedString]];
    [_buildingImageView setImage:[_detailItem buildingImage]];
    _oi = [_detailItem objectIndex];
}
}

分配和初始化新的和现有的 detailViewControllers 的 MasterViewController(根表视图)方法

- (void)insertNewObject:(id)sender
{
//add button invokes this
DetailViewController *ivc = [[DetailViewController alloc] init];
[self.navigationController pushViewController:ivc animated:YES];
NSLog(@"detailViewController allocated and initialized: %@", ivc);
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (!self.detailViewController) {
    self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    NSLog(@"detailViewController initialized: %@", self.detailViewController);
}
//navigates to detailViewController and passes it the item's data
self.detailViewController.detailItem = [[[RoomList sharedStore] getAllItems] objectAtIndex:[indexPath row]];
[self.navigationController pushViewController:self.detailViewController animated:YES];
}

这是 tableView:didSelectRowAtIndexPath 方法,它应该从 RoomList:sharedStore 传递详细视图控制器所需的所有内容:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (!self.detailViewController) {
    self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
}
//navigates to detailViewController and passes it the item's data
self.detailViewController.detailItem = [[[RoomList sharedStore] getAllItems] objectAtIndex:[indexPath row]];
[self.navigationController pushViewController:self.detailViewController animated:YES];
}

...和 ​​RoomItem.m 文件:

- (void)awakeFromFetch
{
[super awakeFromFetch];

UIImage *pic = [UIImage imageWithData:[self buildingThumbnailData]];
[self setPrimitiveValue:pic forKey:@"buildingThumbnail"];
}
- (id)initWithRoom:(NSString *)room Building:(NSString *)building 
{
self = [super init];
if (self) {
    [self setRoom:room];
    [self setBuilding:building];
}
return self;
}

DetailViewController.h

#import <UIKit/UIKit.h>
@class RoomItem;
//pic edit: added delegates
@interface DetailViewController : UIViewController <UINavigationControllerDelegate,
UIImagePickerControllerDelegate, UITextFieldDelegate, UIPopoverControllerDelegate,
UIPageViewControllerDelegate>
{
__weak IBOutlet UITextField *roomField;
__weak IBOutlet UITextField *buildingField;
__weak IBOutlet UILabel *dateLabel;

UIPopoverController *imagePickerPopover;
}
@property (nonatomic, strong) RoomItem *detailItem;
@property (weak, nonatomic) IBOutlet UIButton *updateBtn;
@property (weak, nonatomic) IBOutlet UIButton *detailsBtn;
@property (weak, nonatomic) IBOutlet UITextField *roomTxt;
@property (weak, nonatomic) IBOutlet UITextField *buildingTxt;
@property (weak, nonatomic) IBOutlet UILabel *dateTxt;
@property (weak, nonatomic) IBOutlet UIImageView *buildingImageView;
@property (weak, nonatomic) UIImage *buildingImage;
@property (weak, nonatomic) NSNumber *oi;
- (IBAction)backgroundTapped:(id)sender;
- (IBAction)takePicture:(id)sender;
- (IBAction)updateRoomItem:(id)sender;
- (IBAction)goToReportDetails:(id)sender;
@end

编辑:这是一个伪 UML 图,说明了当我使用调试器单步执行时所看到的内容(它从左到右,从上到下读取): 在此处输入图像描述

4

2 回答 2

1

没有调用setter是很奇怪的。我会排队

self.detailViewController.detailItem = [[[RoomList sharedStore] getAllItems] objectAtIndex:[indexPath row]];

并用这段代码替换它,这可能更容易理解:

RoomItem *tempItem = [[[RoomList sharedStore] getAllItems] objectAtIndex:[indexPath row]];
DetailViewController *tempDVC = self.detailViewController; // could just use _detailViewController
tempDVC.detailItem = tempItem;  // breakpoint on this line

然后当断点命中时,我会单步执行已编译的汇编程序以找出它的去向。在 Xcode Debugger 上有相关说明- 如何在 CPU 指令级别单步执行- 特别是几周前 Max MacLeod 的答案。

我会把它写成另一个评论,因为它不是一个真正的答案,但它太长了!

于 2012-11-28T21:58:30.677 回答
0

好吧,首先是第一件事。跳过 -(void)setDetailItem:(RoomItem *)newDetailItem 的原因是我没有将 DVC 中新创建的 RoomItem 传递给它。我最初是这样做的,但是在尝试在其他地方纠正问题时错误地摆脱了它。

在 DetailViewController.m 中:

- (void)insertNewObject:(id)sender
{
RoomItem *newItem = [[RoomList sharedStore] createItem];

DetailViewController *ivc = [[DetailViewController alloc] init];

[ivc setDetailItem:newItem];

[self.navigationController pushViewController:ivc animated:YES];
NSLog(@"detailViewController allocated and initialized: %@", ivc);
}

尽管在 RoomList.m 文件中进行了一些重组,但要使其正常工作。我最初试图将创建和更新功能结合到一种方法中。如果我在 MVC 中创建并在 DVC 中更新,那不会飞。

所以我把两者分开:

- (RoomItem *)createItem
{
double order;

//create new roomItem
//tracks what number item it's creating
if ([allItems count] == 0) {
    order = 1.0;
}
else
{
    order = [[[allItems lastObject] objectIndex] doubleValue] + 1;
}
NSLog(@"Adding after %d items, order = %.2f", [allItems count], order);

RoomItem *p = [NSEntityDescription insertNewObjectForEntityForName:@"RoomItem"
                                                inManagedObjectContext:context];

[p setObjectIndex:[NSNumber numberWithDouble:order]];
[p setDateCreated:[NSDate date]];
[allItems addObject:p];

[self saveChanges];

return p;
}
- (RoomItem *)updateItemWithRoom:(NSString *)room Building:(NSString *)building ObjectIndex:(NSNumber *)objectIndex DateCreated:(NSDate *)dateCreated ImageKey:(NSString *)imageKey BuildingImage:(UIImage *)buildingImage BuildingThumbnail:(UIImage *)buildingThumbnail BuildingThumbnailData:(NSData *)buildingThumbnailData
{
NSError *error = nil;

NSEntityDescription *entity = [NSEntityDescription entityForName:@"RoomItem" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];

int32_t oid = [objectIndex integerValue] - 1;
NSLog(@"objectIndex = %d", oid);

RoomItem *currentRoomItem = [[context executeFetchRequest:request error:&error] objectAtIndex:oid];

//[currentRoomItem setItemEdited:YES];
[currentRoomItem setRoom:room];
[currentRoomItem setBuilding:building];
[currentRoomItem setImageKey:imageKey];
[currentRoomItem setBuildingImage:buildingImage];
[currentRoomItem setBuildingThumbnail:buildingThumbnail];
[currentRoomItem setBuildingThumbnailData:buildingThumbnailData];

[self saveChanges];

return currentRoomItem;
}

最后,setDetailItem 和 configureView 方法:

- (void)setDetailItem:(RoomItem *)detailItem
{
if (_detailItem != detailItem) {
    _detailItem = detailItem;
    [self configureView];
}
}
- (void)configureView
{
if (self.detailItem) {
    [_roomTxt setText:[_detailItem room]];
    [_buildingTxt setText:[_detailItem building]];
    [_dateTxt setText:[self dateCreatedString]];
    [_buildingImageView setImage:[_detailItem buildingImage]];
}
}

这应该作为一个关于花时间阅读核心数据文档或任何其他文档的教训......尤其是像我这样的菜鸟。

再次感谢 emrys57 的帮助。

于 2012-11-29T18:42:29.223 回答