Interface builder和.m @ .h之间的冲突:谁赢了?

时间:2012-06-06 13:16:22

标签: ios interface-builder xcode4.2 uitextfield

我一直想知道Xcode如何解释IB和programmaticaly编码对象的使用。 例如:initWithStyle在.m中创建了一个表,但我将plain设置为我正在处理的tableviewcontroller属性中的样式。所以?我注意到代码越过了IB。

当我不得不通过在第一个单元格中插入标题和UITextField来定制详细信息表时首先出现,这对于IB来说非常容易。但是当我运行应用程序时,除了普通表的模板之外什么都没有。 gnuh ??

感谢您的帮助。 干杯, 路易斯

修改

这是TableViewController的实例化:

    - (id)initWithStyle:(UITableViewStyle)style
    {
self = [super initWithStyle:style];
if (self) {
    // Custom initialization
}
return self;
}

4 个答案:

答案 0 :(得分:2)

他们永远不应该交叉。如果使用[[UITableView alloc] initWithStyle:UITableViewStyleGrouped]实例化一个表,它会创建一个新表而不通过NIB。如果从NIB实例化表,则使用-initWithCoder创建实例:。


在更新后添加

好的,你是UITableView的子类。除了覆盖-initWithStyle:之外,您还需要覆盖-initWithCoder:-awakeFromNib

从NIB加载自定义UIView的基本流程。

  • -initWithCoder:用于实例化对象
  • 所有NIB连接都是make(IBOutlets和IBAction已连接)。
  • -awakeFromNib发送给对象

这意味着如果您在-initWithCoder:中设置值,则NIB设置将获胜;如果您在-awakeFromNib中设置了值,则您的代码将获胜。

请务必阅读“{3}}部分的子类注释和方法”。

答案 1 :(得分:0)

这完全取决于您如何初始化对象。如果从控制器的init方法加载UITableView并调用initWithStyle,那就是你的UITableView。如果你想使用IB,你需要用initWithNibName初始化你的控制器,并且你的视图有一个IBOutlet连接,它有简单的设置。

答案 2 :(得分:0)

嗯,我不确定,但我认为我找到了解决方案的开始。这是我的想法。

我认为是面向IB的设计。 编译器将要求IB实例化视图。 但是如果我们创建了一个UITableViewController子类,那么我们所有的方法都引用了这个视图的实例化(正确的单词?)。

因此,为了避免这种冲突,我们可以删除.M中的代码,它引用表的初始化:initWithStyle和关于Table源的pragma标记。我们只让任何视图和委托所需的View生命周期。

我发现了一些例子。这是一个详细视图表的.m,它在IB上设计了静态单元格:

    #import "PictureListDetail.h"

    @implementation PictureListDetail

    @synthesize managedObjectContext;
    @synthesize currentPicture;
    @synthesize titleField, descriptionField, imageField;
    @synthesize imagePicker;

    #pragma mark - View lifecycle

    - (void)viewDidLoad
    {
[super viewDidLoad];

// If we are editing an existing picture, then put the details from Core Data into the text fields for displaying
if (currentPicture)
{
    [titleField setText:[currentPicture title]];
    [descriptionField setText:[currentPicture desc]];
    if ([currentPicture smallPicture])
        [imageField setImage:[UIImage imageWithData:[currentPicture smallPicture]]];
}
 }

   #pragma mark - Button actions

   - (IBAction)editSaveButtonPressed:(id)sender
    {
// If we are adding a new picture (because we didnt pass one from the table) then create an entry
if (!currentPicture)
    self.currentPicture = (Pictures *)[NSEntityDescription insertNewObjectForEntityForName:@"Pictures" inManagedObjectContext:self.managedObjectContext];

// For both new and existing pictures, fill in the details from the form
[self.currentPicture setTitle:[titleField text]];
[self.currentPicture setDesc:[descriptionField text]];

if (imageField.image)
{
    // Resize and save a smaller version for the table
    float resize = 74.0;
    float actualWidth = imageField.image.size.width;
    float actualHeight = imageField.image.size.height;
    float divBy, newWidth, newHeight;
    if (actualWidth > actualHeight) {
        divBy = (actualWidth / resize);
        newWidth = resize;
        newHeight = (actualHeight / divBy);
    } else {
        divBy = (actualHeight / resize);
        newWidth = (actualWidth / divBy);
        newHeight = resize;
    }
    CGRect rect = CGRectMake(0.0, 0.0, newWidth, newHeight);
    UIGraphicsBeginImageContext(rect.size);
    [imageField.image drawInRect:rect];
    UIImage *smallImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // Save the small image version
    NSData *smallImageData = UIImageJPEGRepresentation(smallImage, 1.0);
    [self.currentPicture setSmallPicture:smallImageData];
}

//  Commit item to core data
NSError *error;
if (![self.managedObjectContext save:&error])
    NSLog(@"Failed to add new picture with error: %@", [error domain]);

//  Automatically pop to previous view now we're done adding
[self.navigationController popViewControllerAnimated:YES];
    }

   //  Pick an image from album
   - (IBAction)imageFromAlbum:(id)sender
   {
imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
[self presentViewController:imagePicker animated:YES completion:nil];
     }

    //  Take an image with camera
   - (IBAction)imageFromCamera:(id)sender
   {
imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.cameraDevice = UIImagePickerControllerCameraDeviceRear;
[self presentViewController:imagePicker animated:YES completion:nil];
     }

      //  Resign the keyboard after Done is pressed when editing text fields
      - (IBAction)resignKeyboard:(id)sender
     {
[sender resignFirstResponder];
     }



    @end

可在此处获取:enter link description here

你怎么看?

答案 3 :(得分:0)

即使我现在独自一人在这篇文章中,我想发布答案!

我终于弄清楚为什么我的文本字段没有显示哪个显示谁有关于编译器。

我实际上用一个实现方法的子类来细分细节,用coreData填充表源。然后,假定的静态单元实际上已经填充了这些方法。

根据我的拙见,这表明.m超越了IB。