??在工程中,或許會遇到這樣的場景:按鈕需要有兩種狀態,一種是默認狀態,另一種是被選擇狀態。通常,這些按鈕代表的事物都是工程中自己所創建類生成的對象。
??起初(才接觸控件的時候),對于這個按鈕選擇與未選擇狀態的切換,我的處理方式是給按鈕設置標記類的值(tag),來表示按鈕當下所處的狀態,在按鈕的點擊方法中,根據當前點擊按鈕的標記值,來判斷按鈕所處的狀態,然后改變按鈕的背景圖片,來配合表示按鈕的選擇狀態。
??上邊的這種邏輯,如果只是改變按鈕選擇狀態的話,思路明了。
??但是,如果遇到了更復雜的需求,比如說:要對按鈕的狀態進行記錄,當前頁面選擇了的按鈕,退出后下一次再來到這個界面,還要將這些按鈕設置為被選擇狀態,這樣的話該如何處理呢?
??使用之前的方法來處理也能夠實現,但是會有些麻煩,因為我們需要處理視圖的表現狀態,然后需要處理如何才能將選擇了的模型被記錄下來。我開始就是使用的這種方法,將思路重新梳理了一下,希望能夠幫到大家。
場景描述:
??頁面A中的修改按鈕,點擊可以進入頁面B,頁面B中會默認展示已經被選擇過的模型,頁面B中選擇了對象之后,點擊確定按鈕會將選擇的對象傳遞到頁面A中,頁面A中發布對象部分會改變,展示出被選擇了的對象。(不知道這個場景描述清楚了沒有。。。)
??頁面A的視圖控制器中,聲明一個全局數組arrayAllModel,此數組中存放按鈕所表示的所有模型對象。頁面B的視圖控制器中,也聲明一個屬性arrayAllModel。頁面跳轉時,將A中裝所有對象的這個數組深拷貝一份,賦值給B的arrayAllModel(正向傳值)。這里必須要把數組拷貝一份,否則會出現,在B頁面不點擊確定,而是點擊返回按鈕返回上個界面,之后在進入頁面B中時,上次選擇過的那幾個對象,還會是選擇狀態。
??對于這里所說的深淺拷貝問題,我參考了這篇文章。http://blog.ximu.site/deep-or-shallow-copy/
??模型類需要遵守NSCoping協議,在這篇文章中也有。
??此外,在模型類中,添加一個叫isSelect的BOOL類型的屬性,用來表示當前模型的選擇狀態,按鈕展示模型時,可以根據模型isSelect屬性的值來設置按鈕的背景。按鈕被點擊之后,在按鈕的操作事件中,改變模型的選擇狀態,改變按鈕的當前狀態,來使視圖展示跟視圖表示一致。
??還需要就是在頁面B的視圖控制器中添加代理,用來在點擊了確定按鈕后,將本頁面的值傳遞回頁面A(反向傳值),在這里需要傳遞的值有視圖B中已經被操作過的arrayAllModel和被選擇的按鈕所表示的模型數組(可以通過自己的方法來得到)。
??最后,在界面A的視圖控制器中,實現代理方法,主要內容是,將傳遞回來的arrayAllModel賦值給A的arrayAllModel(self.arrayAllModel)(這里直接賦值就可以,不需要考慮深淺拷貝的問題),然后,改變頁面A的發布部分的顯示狀況(對于我來說是刷新表)。
??這些就是主要的思想,,描述不清楚的地方,大家見諒!!
??如果有什么其他更好的方法的話,或者是指正不足,希望您能夠提出來,共同進步!
??用文字來表達思想,用思想來指導編程,希望我的文字能夠對你的編碼帶來幫助!
??大家加油!