iOS程式設計遇到的一些難點問題總結

2021-07-10 10:20:53 字數 3368 閱讀 2829

最近做的乙個專案,雖然不大,但剛開始接觸ios程式設計,遇到和克服的問題還不少,記錄下來,溫習一下,或者對別人也會有一點幫助。

這個專案採用的是swift和objective c,cpp混合程式設計的方式,有些模組之前在別的平台已經實現了,想直接拿過來用。另一方面是對swift不太熟悉,而且版本變化太快,很多時候按照教程例子來做,結果還是錯誤。感覺objective c相對穩定一點,所以主體還是以oc為主。

1. swift語言裡面的?和!問題

有幫助的網頁,網上查了很多,各說紛云,看得一頭霧水,還好乙個網頁講得算是明白一點。

2. table view的邏輯

由於ios系統是不開源的,因此我們要實現**功能必須安裝系統預定好的套路來走。有幾個關鍵點,第乙個是它的2個**,其中乙個**負責提供資料,所謂提供資料,就是2個最主要的介面函式,第乙個是告訴系統**有多少行,第二個就是告訴系統每一行裡面的資料是什麼內容。第二個會被多次呼叫,假設乙個頁面裡面有10行,那麼這個介面函式就會被呼叫10次。但不會超出乙個頁面的次數,因為系統只會請求當前使用者看到的頁面的資料。假如**的資料有100個,那麼它是通過不斷滾動的過程中丟棄舊的,填充新的資料這種方式來實現的。

這是關於view的乙個**,另外乙個**是關於controller的,就是當使用者點中**的某一項時,程式要做些什麼,這裡面最常用的就是didselected介面函式,開發者只需要在這裡面寫自己的實現**即可。要注意不要寫到diddeselected裡面,這裡面的函式名很容易搞混,這個deselected是某一項從選中變成不被選中時呼叫的介面。一開始我寫到這個裡面,總感覺**不對,後來才發現。

使用customer型別的prototype時,如何訪問裡面的label物件?tag的使用。

常見的**例子,**裡面的cell只有最多2個標籤,但我的專案裡要放入5個標籤,那麼如何在**裡面操作這些標籤呢?由於介面是在ib裡面拉進去的,而cell裡面的標籤卻不能通過ctrl drag的方式拉進**裡面。後來看到乙個例子是給每個標籤定乙個tag值,然後在**裡面用viewbytag

uilabel *name = [cell viewwithtag:tag_name];

uilabel *singer = [cell viewwithtag:tag_singer];

uilabel *code = [cell viewwithtag:tag_code];

uilabel *lang = [cell viewwithtag:tag_lang];

uilabel *type = [cell viewwithtag:tag_type];

通過這樣的方式就能獲取到對於的label。

後來偶然的機會了解到,還是能通過直接的方式訪問,但麻煩一點,就是要先把cell用乙個class定義好,然後在inte***ce裡面手工建立好label的宣告,這個時候就可以storyboard裡面拉線到table view裡面了。

這個頁面裡面討論了這個問題。

debug顯示的資訊是:

總的來說,還是自己功夫不夠深。以後還要深入把基礎打好才行。

3. search bar的邏輯

這個頁面裡面提供的方式比較適合我。

4. 用ib來做介面還是用**裡面實現?

用**來設定控制項的大小有可能在適配不同的螢幕時出現問題,暫時還沒有去研究auto resize的部分要怎樣做。

但用**要做介面其實沒有想象中那麼難,其實只有把介面中的控制項當成物件來處理就可以了,建立物件,設定物件的熟悉,把物件add到view裡面,設定相關的delegate,然後就ok了。

5. bundle檔案的訪問方式

這個專案需要訪問外部的乙個bin檔案,從這個檔案裡面讀取資料,但ios與android不同,它有乙個sandbox的機制,應用程式只能訪問自己的空間。所以不能把bin檔案放在sdcard目錄,而是乙個叫bundle的目錄。

-(void)loadindexfile
這樣就可以獲取到目標檔案的路徑,然後就可以像一般的檔案操作那樣對它進行open,read, seek了。

但是bundle是唯讀的,如果有要寫如的檔案,則需要通過

nsstring *filepath=[[nsstring alloc]initwithformat:@"%@/megidx",nshomedirectory()];

6. 容易導致程式崩潰的原因

由於某些物件會被自動釋放,所以當某些物件不能被訪問到時,就會導致崩潰。解決的辦法是遮蔽掉一些地方,看問題是否仍然出現。有些物件如果只有指標,而沒有例項化,也會導致崩潰,特別是列表的array,需要用alloc init這樣的方式分配好空間,甚至要預先賦值,否則當程式需要訪問時會導致崩潰。

有些又ib建立的物件,也很容易因為配置不當而導致程式崩潰,比如說某個物件在ib裡刪除了,後來又新增乙個同名的物件,這個時候它之前殘留的outlet會仍然連線到**裡,但這個時候會有可能導致出錯,正確的方法是同時刪除全部重新做一次。

7. 對介面卡模式的理解

8. 對segue的理解,新舊版本ios的變遷

segue是在storyboard裡面連線2個檢視控制器的那個箭頭,它起到承接2個物件之間切換的功能,它需要把前乙個物件裡面的資訊傳遞到下乙個物件去的這麼乙個功能角色。

- (void)prepareforsegue:(uistoryboardsegue *)segue

sender:(id)sender

這個方法用來在介面切換時執行一些**。傳進來2個引數都是有用的。

9. 二進位制字串的處理,如何解決顯示亂碼的問題。

對於中文,需要定義乙個nsstringencoding物件,然後在init nsstring的時候傳進來,

nsstringencoding

if ([lang isequaltostring:@"chinese"] == true) else if([lang isequaltostring:@"vietnam"] || [lang isequaltostring:@"remix"])

else

對於越南文,則需要在底層轉換成unicode編碼,然後用initwithcharacters這個函式來給nsstring初始化。

對於英文,則需要用nsutf8stringencoding來初始化字串。

總結,ios系統內部以unicode為主,其他的編碼最終會被轉換成unicode處理。nsstringencoding物件提供了乙個函式入口給nsstring的初始化方法,它其實是先用這個轉換函式把別的格式的編碼轉換成為ios統一使用的unicode編碼,然後再初始化一次。

10. cpp**移植到ios專案遇到的問題,關於過載。

cpp支援同名的構造方法,而ios匯入這樣的同名方法會報錯,解決的辦法是把另外的構造方法改乙個名字。

androidX 遷移中所遇到的一些問題總結

2019年九月,google正式發布了android10,由於android對android9以後的包不再維護,最近客戶也是很多android10的手機出了問題,所以不得不進行遷移至android10進行相容 下面是我的遷移過程以及遇到的一些問題進行記錄,希望可以幫助遷移中遇到問題的你 一.首先進行...

pyton程式設計中遇到的一些問題

1 開啟並讀取乙個亂碼檔案,出現錯誤 使用python的時候經常會遇到文字的編碼與解碼問題,其中很常見的一種解碼錯誤如題目所示,下面介紹該錯誤的解決方法,將 gbk 換成 utf 8 也適用。1 首先在開啟文字的時候,設定其編碼格式,如 open 1.txt encoding gbk 2 若 1 不...

軟體程式設計中遇到的一些問題

問題如下 一。vb不能載入 ocx 可能是解除安裝其它軟體時把這些控制項給刪掉了,需重新註冊,重新安裝vb不起作用,要常備vb6.0的安裝程式。將缺少的.ocx 一般在 common tools vb controls下 複製到system32下,執行 regsvr32 ocx 提示註冊成功 二。d...