2017-06-22 45 views
0

我有一個類MyCell,它有一個委託和一個實例變量tagToIndex。我想在委託人修改它之後打印這個變量。目前我的代碼看起來是這樣的:如何訪問委託函數中的變量?

class MyCell: UITableViewCell, YSSegmentedControlDelegate { 

var tagToIndex: Dictionary<Int,Int>? 

    func segmentedControl(_ segmentedControl: YSSegmentedControl, willPressItemAt index: Int) { 

    tagToIndex[actionButton.tag] = index 

} 


print(tagToIndex) 
} 

的問題是,而不是打印tagToIndex,因爲它在委託函數(willPressItemAt)存在,tagToIndex是零。

我也嘗試使用回調將索引發送回視圖控制器。代碼如下所示:

var switchTapIndex: ((Int)->Void)? 

func segmentedControl(_ segmentedControl: YSSegmentedControl, willPressItemAt index: Int) { 


    switchTapIndex?(index) 

} 

不幸的是,當我在單獨的函數中打印該值時,該值仍然返回「無」。也許我沒有完全理解回調是如何工作的,但我不知道怎麼樣我做的是不是使用像這樣的開關函數內的回調有什麼不同:

var switchTapAction : ((Bool)->Void)? 
func switched(_ sender: UISwitch) { 
    print("Switched: \(sender.isOn)") 

    // send the Switch state in a "call back" to the view controller 
    switchTapAction?(sender.isOn) 
} 
+0

,爲什麼是相關方法之外的'print'語句? – crizzis

+0

[讀取代理函數中存在的變量]的可能重複(https://stackoverflow.com/questions/44679900/reading-a-variable-that-exists-in-a-delegate-function) – crizzis

+0

我不僅必須打印它,我必須在課程中的其他位置實際使用該變量。 –

回答

0

在這裏,你可能會得到tagToIndex作爲零因爲你沒有初始化該變量。只要嘗試,

func segmentedControl(_ segmentedControl: YSSegmentedControl, willPressItemAt index: Int) { 
    if tagToIndex == nil { 
    tagToIndex = Dictionary() 
    } 
     tagToIndex[actionButton.tag] = index 

    } 


    print(tagToIndex) 
    } 
0

下面一行聲明tagToIndexDictionary<Int, Int>?類型的屬性。換句話說,它是從IntInt的可選Dictionary映射。可選屬性默認爲nil。既然你還沒有初始化它,它是nil

var tagToIndex: Dictionary<Int,Int>?

使該屬性非可選通過移除?,並初始化它:如果你要打印它,它已經被委託修改後

var tagToIndex: Dictionary<Int,Int> = [:]