2012-06-06 42 views
1

我一直想知道現在Xcode如何解釋IB和編程對象的使用。 ex:I initWithStyle在.m中分組了一個表格,但我將plain設置爲我正在處理的tableviewcontroller的屬性中的樣式。所以?我注意到代碼覆蓋了IB。接口生成器和.m @ .h之間的衝突:誰贏了?

它首次出現,當我必須通過在第一個單元格中插入頭和UITextField來定製詳細表時,這對IB來說非常簡單。但是當我運行該應用程序時,除了普通表格的模板外,沒有什麼。 gnuh ??

謝謝你的幫助。 乾杯, 路易

編輯

這裏是TableViewController的實例化:你如何初始化對象

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

回答

0

這一切都依賴。如果你從你的控制器的init方法加載UITableView並調用initWithStyle,那麼你的UITableView將會是這樣。如果你想使用IB的話,你需要用initWithNibName初始化你的控制器,並且有一個IBOutlet連接到你的視圖,它有簡單的設置。

+0

這是我擁有的: - (id)initWithStyle:(UITableViewStyle)風格 { self = [super initWithStyle:style]; if(self){ //定製初始化 } return self; } 然後,我通過引入一個UITextField和一個頭文件來保持IB的設計,但是我沒有將UITextField作爲IBOutlet鏈接到.h btw,如何引入代碼?它不是那麼明確.. – louisD

2

他們不應該跨越。如果使用[[UITableView alloc] initWithStyle:UITableViewStyleGrouped]實例化一個表,它將創建一個新表,而不需要通過NIB。如果您從NIB實例化一個表,它會使用-initWithCoder:創建一個實例。


添加後更新

OK,你是子類的UITableView。除了覆蓋-initWithStyle:之外,您還需要覆蓋-initWithCoder:-awakeFromNib

從NIB加載自定義UIView的基本流程。

  • -initWithCoder:用於實例化對象
  • 所有NIB連接使(IBOutlets和IBAction爲連接)。
  • -awakeFromNib是發送對象

這意味着,如果你在-initWithCoder:設定的值時,NIB設置會贏;如果你在-awakeFromNib中設置了一個值,你的代碼就會贏。

務必閱讀子類註釋和方法來覆蓋UIView的各個部分。

+0

我不明白。實例化過程如何工作?結論是,我必須在ib或.h @ .m上設置一次。 – louisD

+0

如果您在IB中創建表格視圖,那麼您不得爲該表格視圖調用-initWithStyle:。如果您有特定問題,請發佈代碼示例。 –

+0

謝謝你的回答@jefferyThomas,我編輯了主要問題中的代碼。 – louisD

0

嗯,我不確定,但我想我找到了解決方案的開始。這是我的想法。

我認爲面向IB的設計。 編譯器會要求IB實例化視圖。 但是,如果我們創建了一個UITableViewController子類,那麼我們所有的方法都會引用這個視圖的實例化(正確的單詞?)。

因此,爲了避免這種衝突,我們可以在.M中刪除引用表的初始化的代碼:initWithStyle和Table源的編譯標記。我們只是讓任何視圖和委託所需的View生命週期。

我發現了一些使用它的例子。這裏是設計與靜態細胞對IB的詳細視圖表的.M:

#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

你覺得呢?

0

即使我現在單獨在這篇文章上,我想發佈答案!

我終於明白爲什麼我的文本框沒有出現,顯示誰在編譯器上有手。

我實際上用一個類來實現細節,實現了用coreData填充表源的方法。然後,假定的靜態單元實際上被這些方法填充。

對我的愚見來說,這表明.m超過了IB。