簡體   English   中英

iOS - 可包含其他視圖的自定義視圖

[英]iOS - Custom View that can contain other views

有一段時間我一直在使用自定義單元格(有自己的筆尖)來表沒有問題。 現在,在一個新項目中,我發現需要一個可重復使用的自定義視圖(不是一個單元格),它將擁有一個標題,一個按鈕,以及另一個可以容納更多視圖的UIVIew。 我稱之為“部分”:

在此輸入圖像描述

我們的想法是能夠在故事板中使用此部分(使用UIView並相應地設置自定義類)。 這樣,我在UIView里面放置的任何視圖實際上都包含在該部分的內部UIView中。

我認為難以實際獲得使用IB和Storyboard實際駐留在內部UIView中的視圖而不是Section的根UIView。 結果只是使自定義視圖(沒有任何內部視圖)不能像我期望的那樣工作。 這是代碼,它基於我已經完成和工作的幾十個自定義單元格(雖然針對通用UIView的特定init方法進行了調整):

#import "SectionContainer.h"

@implementation SectionContainer

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"SectionContainer" owner:self options:nil];
        self = [nibArray objectAtIndex:0];
        /*NSArray *nibRoot = [[UINib nibWithNibName:@"SectionContainer" bundle:nil] instantiateWithOwner:self options:nil];
        [self addSubview:[nibRoot objectAtIndex:0]];*/
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Initialization code
        NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"SectionContainer" owner:self options:nil];
        self = [nibArray objectAtIndex:0];
        /*NSArray *nibRoot = [[UINib nibWithNibName:@"SectionContainer" bundle:nil] instantiateWithOwner:self options:nil];
        [self addSubview:[nibRoot objectAtIndex:0]];*/
    }
    return self;

}

匹配的XIB將其根視圖設置為此自定義類(就像我在自定義單元格中一樣)

問題

這個自定義類導致EXC_BAD_ACCESS代碼= 2,並且通過逐步執行它可以告訴我,就好像該類是遞歸調用的一樣。 在調用initWithDecoder之后調用call,直到發生EXC_BAD_ACCESS錯誤

我做了什么

  • 鑒於看似遞歸調用,我嘗試了另一種方法,我看到將XIB的文件所有者設置為自定義類而不是XIB的根視圖。 這導致以下錯誤:

'NSUnknownKeyException',原因:'[setValue:forUndefinedKey:]:此類不是鍵值sectionContainerView的鍵值編碼兼容

  • 嘗試了一個稍微不同的方法(在上面的代碼中注釋掉),其中XIB的根被添加到自定義類(addSubView)而不是設置為它。 這沒有改變任何東西,相同的遞歸調用(或如果設置了上面的錯誤)

我真的很感激這方面的一些指導。 謝謝。

您需要在故事板中使用名為Custom Container View的組件。 我不能在這里發布代碼,因為它涉及到故事板中的一些配置,代碼將取決於您如何探測您的視圖/ VC,但您可以在此處閱讀相關指南:

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

首先,遞歸調用在initWithCoder:上,加載一個nib意味着通過initWithCoder實現其視圖的實現:

這就是為什么你不能以這種方式使用你在nib上設計的UIView子類(通過在故事板上甚至在另一個nib上設置視圖的類)。

使用它的唯一方法是在代碼中通過nib實例化它。

Section *sectionView = [[[NSBundle mainBundle] loadNibNamed:nibName owner:owner options:options] objectAtIndex:index];

現在,通過你所做的筆尖連接:你可以從筆尖上的對象連接到另一個在筆尖上找不到的對象。 這就是文件所有者的用途。 您必須設置其(文件所有者)類,並與其建立連接,並使用其實現連接的類的實例作為加載筆尖時的所有者參數。

但我想這不是你想要的。 我想你想通過“Section”來訪問nib上的子視圖,我假設它是nib上的根視圖。 您可以在Section類上創建IBOutlet(或IBAction,IBOutletCollection)屬性。 要將它們與筆尖上的其他對象連接起來,控制點擊筆尖上的“截面”視圖,您將看到從那里做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM