2015-04-17 67 views
2

我想在ViewController中創建一個自定義的下拉列表。將會有5個下拉列表,每個列表將有4個選項。由於列表數量衆多,我決定製作一個UIView,其中每個列表都有UIButtons形式的四個選項。現在我只是想讓人失望。因此,以下代碼適用於一個帶有FIVE選項的下拉列表(包括所選的一個,我將在下面進一步解釋)。UIView類與UIButtons下拉列表 - 委託/協議問題?

基本上我想要的是有一個按鈕顯示選定的值(或啓動時的默認值),然後當你點擊該值,然後包含4個按鈕(又名下拉列表)的UIView顯示如下原始按鈕。當用戶點擊其中一個按鈕時,我希望帶有所選值的按鈕具有被點擊的按鈕的標題。

我有以下問題:

  1. 我希望能夠從視圖控制器的四個按鈕的標題傳遞給UIView的,因爲我想多次與不同的值使用的UIView四個按鈕的標題。我不知道如何將值傳遞給UIView類。

  2. 當單擊下拉列表(即UIButton)的選擇時,我無法弄清楚如何將按鈕的標題值從UIView傳遞迴UIViewController。我嘗試在ViewController中將標題設置爲一個變量,但這不起作用(顯示爲零)。

非常感謝你提前 - 我知道這是一個長期的問題,我真的不能確定這是否是即使採取了什麼,我試圖做一個好方法,但它在我的頭上是有道理的。

這裏是我的視圖控制器

var buttonsLeft: buttonsView = buttonsView() // this is the UIView subclass 

    var time = UIButton.buttonWithType(UIButtonType.System) as! UIButton 

    override func viewWillAppear(animated: Bool) { 

    //hidden drop down list 
    self.buttonsLeft.frame = CGRect(x: self.view.bounds.width*(1/6) - 50, y:120, width:100, height: 135) 
     self.buttonsLeft.hidden = true 

    //button with selection showing or the default value at launch 
    self.time.frame = CGRectMake(self.view.bounds.width * (1/6) - 50, 90, 100, 30) 
     self.time.setTitle("1 DAY", forState: UIControlState.Normal) 
     self.time.addTarget(self, action: "showLeft", forControlEvents: UIControlEvents.TouchUpInside) 
     self.time.hidden = false 
     self.view.addSubview(self.time) 
    } 
    //this function shows the list 
    func showLeft(){ 
     self.view.addSubview(self.buttonsLeft) 
     self.buttonsLeft.hidden = false 
    } 

代碼下面是UIView的buttonsView代碼:

import UIKit 

class buttonsView: UIView { 

var option1 = UIButton() 
var option2 = UIButton() 
var option3 = UIButton() 
var option4 = UIButton() 
var buttons: Array<UIButton> = Array() 
var title:String = String() 


override init(frame: CGRect) { 

    super.init(frame: frame) 
    self.buttons = [option1, option2, option3, option4] 
    self.option1.setTitle("1 DAY", forState: UIControlState.Normal) 
    self.option2.setTitle("1 MONTH", forState: UIControlState.Normal) 
    self.option3.setTitle("1 YEAR", forState: UIControlState.Normal) 
    self.option4.setTitle("LONGER", forState: UIControlState.Normal) 

    var yStep = 35 
    for var i:Int = 0; i < 4; ++i { 
     var totalY:CGFloat = CGFloat(i*yStep) 
     buttons[i].frame = CGRectMake(0, totalY, 100, 30) 
     buttons[i].addTarget(self, action: "choseOption:", forControlEvents: UIControlEvents.TouchUpInside) 
     buttons[i].hidden = false 
     self.addSubview(buttons[i]) 
    } 

} 


func choseOption(sender:UIButton){ 
    self.title = sender.titleLabel!.text! 
    MyView().parentTitle = sender.titleLabel!.text! // my attempt at assigning to variable in View Controller 
} 


required init(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 
} 
+0

您可能想稍微打破這個問題。 – efischency

+1

你在正確的軌道上,但不要試圖用強烈的引用將視圖指向ViewController。你應該看看代表團。 (NSUInteger)numberOfButtons和(NSString *)titleForButtonNumber:(NSUInteger)buttonIndex然後使用(void)didSelectButtonNumber的單獨委託協議:(NSUInteger)如果您遵循Apple的設計模式,您將擁有兩個協議:數據源)buttonNumber祝你好運:) – Jef

+0

@Jef,使很多道理。我不知道如何在Swift和蘋果文檔中以編程方式正確處理委託,因爲它仍然處於Objective C中,但我將開始爲此尋找。謝謝你的樣子! – user3498976

回答

1

代表團將幫助你實現價值傳遞給UIViewController

以下是您可以在swift中執行delegate的方式。

步驟1:在class中聲明用於sending數據的協議。這裏是buttonsview

@objc protocol MyButtonDelegate{ 
    optional func didSelectButton(text:String) 
} 

第2步:現在宣佈delegate在發送類。這裏是buttonsview

class buttonsView: UIView { 
    var delegate:MyButtonDelegate? 
    [other stuf......] 
} 

第3步:現在使用委託將數據發送到'UIViewController'。

func choseOption(sender:UIButton){ 

    delegate!.didSelectButton(text: sender.titleLabel!.text!) 

} 

步驟4:在接收類中採用協議。

class ViewController: UIViewController,MyButtonDelegate { 

第5步:在接收類中實現委託方法。

func didSelectButton(text: String) { 
    parentTitle = "The Buttons title is " + text 

    } 

第6步:現在設置delegate

override func viewDidLoad() { 
    super.viewDidLoad() 

    buttonsLeft.delegate = self 


    } 

希望這有助於你。

+0

當我創建buttonsView時,如何將數據從UIViewController傳遞給UIView的任何建議。再次感謝! – user3498976

+0

是的,在這裏我解釋爲將'NSString'從'UIViewController'傳遞給'UIView'。像'var strTitle = String()'一樣在'UIView'中聲明'NSString',並且在'UIVIewController'中,將內存分配給'buttonsView'。所以在'buttonsView'對象的幫助下,你正在像'self.buttonsLeft.strTitle = @「Hello Buttons」'一樣訪問'UIView'類的'string'變量。你可以根據你的要求傳遞'NSArray,NSDictionary'等。 –

+0

讓我知道你是否仍然有問題。 –