2017-05-11 40 views
0

我是iOS開發新手。我正試圖在我的應用程序中實現一個XIB。我想添加這個XIB作爲視圖的一部分,並且我希望能夠獲取/捕獲在這個XIB的子視圖(按鈕,圖像等)上發生的點擊/點擊。我首先將XIB的文件所有者類設置爲一個UIView子類,但是現在我看不到處理從這個子類到我的ViewController中的點擊/點擊的方法。XIB - UIView或UIControllerView

我應該(而且我允許)將文件所有者類設置爲我的ViewController類嗎?這是允許的嗎?我們應該如何處理XIB中的這些點擊/點擊?

回答

0

不,您不應該將FileOwner設置爲ViewController。您應該向ViewController添加手勢識別器,並將該手勢識別器添加到視圖。

我不知道斯威夫特,但在目標C,你會做這樣的事情:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarger:customView action:@selector(mySelector)];

0

文件的所有者是代理或替身將被識別的實際對象的時候,筆尖加載。 [編輯。我應該注意到「nib」是接口文件的舊學期。 xib是新的名字。當你的項目被構建時,其實xib文件會被編譯成nib文件。請原諒我,如果我有點老派,並且可以互換使用nib/xib]您可以選擇在您的界面文件中使用視圖控制器作爲「文件所有者」。使用它可能是這個樣子:

class MyViewController : UIViewController { 
    @IBOutlet loadedView : UIView! 

    func loadMyInterface() { 
     // load the nib with myself as the "Files Owner". If the nib file is set up properly 
     // shoudl set the "loadedView" outlet on this object 
     Bundle.mainBundle.loadNibNamed("MyLoadedView", owner: self, options: nil) 

    } 
} 

在此代碼段,我有loadedView出口。當我的視圖控制器被創建時,這將是nil。然後在執行我的程序時,我打電話給loadMyInterface。該例程將要求主包加載接口文件「MyLoadedView」。請注意,在這一點上,我告訴系統什麼對象「文件的所有者」代表。由於我已將我的視圖控制器識別爲owner,因此界面文件中爲文件所有者標識的任何插座都將連線到該視圖控制器。

此外,您可以在視圖控制器類上定義Actions並將它們連接到界面構建器中的「文件所有者」,並在lib被加載時將它們定向到視圖控制器。

請注意,然而,這只是因爲我已經加載了筆尖時將我的視圖控制器識別爲owner。我可以很容易地設置任何其他對象作爲文件的所有者,並指示業主的出口和行動應該去那裏。

0

爲了簡單起見,您可以爲Xib創建一個自定義類,就像使用viewController的按鈕和標籤插口,IBAction等一樣。然後,您創建一個協議,並將您的目標MainView和ViewController中的委託設置爲該協議,以在其中顯示Xib。當點擊Xib中的按鈕時,它將引用該協議並在viewController中調用一個函數。

CustomView:

protocol customViewDelegate: class { 
func buttonClicked() 
} 

class CustomView: UIView { 
weak var delegate: customViewDelegate? 

@IBAction func buttonPressed(_ sender: Any) { 
    delegate?.buttonClicked() 
} 
} 

而視圖控制器:

class viewController: UIViewController { 
@IBOutlet weak var viewContainer: CustomView! 

var customView: CustomView? 

override func viewDidLoad() { 
customView = CustomView.loadFromNib() 
customView.delegate = self 
} 
func buttonClicked() { 
    //Do what you wanted to do when the button inside the Xib was clicked. 
} 
}