iOS-常見問題

11.21常見問題

一storyboard連線問題

                       

 

 

產生緣由:將與storyboard關聯的屬性刪除了,可是storyboard中還保持以前所關聯的屬性。數組

解決:app

  1. 點擊view controller
  2. 點擊這排最後一個按鈕
  3. 會出現
  4. 發現感嘆號。點擊感嘆號的左邊的x,取消關聯就不會報錯了。

 

二 文本框中怎麼輸入顯示相似輸入密碼時候的東東。

解決:勾選這個框架

三.輸入文本的時候,怎麼顯示右邊的X按鈕

1.點擊dom

 

 

2.會顯示函數

 

 

3.選擇 ,表示當編輯的時候,會出出現X。動畫

效果:spa

 

                                  

11.22 常見問題

一.Storyboard連線問題。

報錯緣由:1.沒有實現btnClick這個方法。代理

解決方式一:添加這個btnClick這個方法指針

解決方式二:調試

1.點擊view controller

2.點擊這排最後一個按鈕

3.會出現

4.發現感嘆號沒,和以前同樣,x了它,就哦了。

注意點;OC中冒號也算作方法名的一部分喔,記住!

 

 

二.結構體問題

 

 

報錯緣由:OC語法規定:不容許直接修改某個對象的結構體屬性的成員

_btn 是個對象

frame是個結構體。

對象和結構體是不同的,結構體是C語言中的,裏面能夠定義許多屬性,可是不能定義方法,而對象是便可以定義屬性又能夠定義方法的,是典型的面向對象語法。

如何改變對象中結構體屬性的成員:

解決方法一:

    // 既然不能直接修改對象中的結構體屬性成員

    // 先取出結構體

    CGRect frame = _btn.frame;

    // 修改結構體

    frame.origin.y -= 10;

    // 將修改後的結構體從新賦值回去

    _btn.frame = frame;

 

解決方法二:

    // 先取出y值

    CGFloat y = _btn.frame.origin.y;

    // 修改y值

    y -= 10;

    // 從新設置_btn的y值,其餘屬性和_btn保持不變

_btn.frame = CGRectMake(_btn.frame.origin.x, y, _btn.frame.size.width,_btn.frame.size.height);

三.Id問題

 

報錯緣由:id類型不能使用點語法

解決方式一:

    // 利用get方法獲取tag值

    NSInteger i = [sender tag];

 

解決方式二:

// 將id強轉爲UIButton

    UIButton *button = (UIButton *)sender;

    // 就能使用點語法獲取tag,編譯器很笨的,他只會根據當前類型,去判斷是否能使用這個語法。通常強轉爲對應類型,就能使用對應類型的方法了。

NSInteger i = button.tag;

 

 

四.若是發現給控件設置transform屬性,控件沒有任何反應,或者反應了,可是效果不對。

解決方法: 將這個選項取消勾選。

五.若是想讓同一個控件同時即改變位置的移動,又放大。這樣設置是無效果的。

    _btn.transform = CGAffineTransformMakeTranslation(0, 100);

_btn.transform = CGAffineTransformMakeScale(1.2, 1.2);

 

這樣操做是建立新的transform而後賦值,給按鈕的transform,第二次賦值的會把以前賦值的給覆蓋,因此會達不到想要的效果。

解決方法:

    _btn.transform = CGAffineTransformMakeTranslation(0, 100);

    // 在以前的transform狀況下,繼續添加縮放的形變。

    _btn.transform = CGAffineTransformScale(_btn.transform, 1.2, 1.2);

 

 

 

 

六.四捨五入問題。

float i = 1.7;

    // 會自動四捨五入,不保留小數

    NSLog(@"%0.f",i); // 打印結果2

    // 強轉類型不會四捨五入

    int j = (int)i;

    NSLog(@"%d",j); // 打印結果1

 

 

 

 

 

 

七.優先級問題

//    int b = 2;

//    int a = 4 * (b == 2? 1:2);

//    NSLog(@"%d",a); 打印出4

   

//    int a = 4 * b == 2? 1:2;

//    NSLog(@"%d",a); 打印出2

   

//    由此得出 * 比 == 優先級高,先算*,在算==

 

 

八.模擬器黑屏

解決方法:

 

九.打代碼時,Xcode沒提示

解決方法:

  1. 點擊Preferences

 

1. 進入Text Editing

2. 勾選

 

 

 

 

 

 

 

 

十.有的同窗可能在勾選 Autolayout的時候,搞錯了對象,誤把控制器的View的User Interaction Enabled勾選掉了。

 

解決辦法:User Interaction Enabled 必須勾選,不然控制器根視圖中全部子控件沒法進行任何操做。

 

 

 

 

11.23 常見問題

一.訪問權限

錯誤:

 

會報連接錯誤。

 

 

報錯緣由,利用下劃線訪問了@package這個權限裏的東西。

 

被@package 修飾的成員屬性只能在同一個框架內部才容許訪問。不然會引起link erro。

@private 實例變量只能被聲明它的類訪問

@protected 實例變量能被聲明它的類和子類訪問。

@public 實例變量能夠被任何類訪問。

 

11.24 常見問題

一.運行程序時,顯示運行完成,可是模擬器沒反應。

 

問題緣由: 有時候應用程序的標示符同樣,會致使程序不能成功運行。

解決方式一:將模擬器以前的程序刪除。

解決方式二:  將模擬器還原

 

二.2d表示保留兩位 02d 表示不夠了 用0來補齊。

    NSLog(@"%02d",cols);

 

 

 

三.Plist文件讀取。

 

 

錯誤緣由:不要看到有不少元素的,就認爲是數組。

這樣解析是錯誤的。

_dict = [NSArray arrayWithContentsOfFile:path];

 

這個pist文件是一個字典,正確的解析此plist文件。

   

   // 2.根據文件路徑加載字典

_dict = [NSDictionary dictionaryWithContentsOfFile:path];

 

四,給程序拖圖片的時候,必定要注意,以下圖勾選的,都要勾選中。

 

 

 

五.禁用UITextField的雙擊出現複製粘貼剪切等操做

解決方式:

有時候咱們須要禁用UITextField的雙擊出現copy paste的功能,然而UITextField自己沒有直接設置禁止用戶複製粘貼剪切操做等方法,可是能夠重載canPerformAction方法來實現。

 

新建一個類繼承UITextField,而後實現canPerformAction方法:
只需覆蓋canPerformAction:withSender方法就能夠,canPerformAction:withSender屬於UIResponder類的。

以下:

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender {

 

UIMenuController *menuController = [UIMenuController sharedMenuController];

if (menuController) {

[UIMenuController sharedMenuController].menuVisible = NO;

}

return NO;

}

 

11.25 常見問題

1.將UIButton添加到UILabel,UIButton是不能點擊的。

 

緣由: 1.UILabel是繼承UIView的,默認不能監聽點擊事件。UIButton是繼承UIControl可以監聽點擊事件。

2.將UIButton添加到UILabel,他們之間的關係是UILabel是UIButton的父視圖,父視圖都不能監聽點擊事件,天然而然不會將事件傳遞給子視圖,所以UIButton也不能監聽點擊事件了。

 

思惟指導:有些人會認爲UIControl不是繼承UIView的嗎,都是繼承UIView,爲何單獨繼承UIControl能夠監聽點擊事件,繼承UIControl的父類UIView不能監聽事件了,這是由於咱們通常在父類裏實現的都是一些共用的屬性和方法,而在子類中具體實現子類特有的方法。所以在UIControl實現了監聽點擊的特有方法,即繼承UIControl才能監聽點擊事件。

2.發現很多人在給成員變量初始化的時候,容易進錯一個方法去初始化。

注意這個方法只有在內存發生警告的時候纔會調用。

- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

   

}

大部分紅員屬性的初始化應該在viewDidLoad裏面進行。

- (void)viewDidLoad

{

    [super viewDidLoad];

}

 

 

最牛解決方法:在一開始就將didReceiveMemoryWarning這個方法刪掉。刪掉不會影響程序運行。

 

3.模擬器問題

 

當出現這個問題的時候,緣由:沒有選擇模擬器。

 

解決辦法:

 

 

 

 

11.26常見問題

1.對象方法和類方法問題(此問題基礎好的能夠看看,基礎稍微差的,能夠先放着,之後回顧的時候,看看。)

    // 建立視圖的工廠方法

    + (UIView *)rowViewInitWithicon:(UIImage *)icon shuju:(NSString *)shuju

    {

        rowView *viewtext = [[NSBundle mainBundle]loadNibNamed:@"rowView" owner:nil options:nil][0];

        [viewtext.btntouxiang setBackgroundImage:icon forState:UIControlStateNormal];

        viewtext.mingzilablexiao.text = shuju;

       

        // 重點是這句

        //  這是往通知中心添加一條通知 指定通知名稱爲  back  當觀察者self監聽到 back 通知是 就調用 callback

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callback) name:@"back" object:nil];

       

        /*   如下是報錯信息:

         +[rowView callback]: unrecognized selector sent to class 0x79d8

         2013-11-26 15:31:02.581 lianxirenlianxi[1266:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[rowView callback]: unrecognized selector sent to class 0x79d8'

         */

        // reason: '+[rowView callback]: 看到報錯緣由裏的+就想到沒有實現callback這個類方法。

       

        // 因爲self這個觀察者是在類方法中添加的,指的是一個類,因此在調用方法的時候,他會去類方法中找有沒有這個方法,不會去對象方法中找。所以咱們也應該實現類方法。所以這裏的self也只能調用類方法

   

        // 因爲實現的callback爲對象方法  因此會報錯

        //  解決方法  把callback  寫成類方法   供觀察者調用

        return viewtext;

    }

    //callback方法

    - (void)callback

    {

        NSLog(@"11111111111");

    }

解決方法,將callback 寫成類方法 供觀察者調用

//callback方法

    + (void)callback

    {

        NSLog(@"11111111111");

    }

 

 

 

2.Xib是用來描述視圖長什麼樣子,一個項目中容許有不少xib,所以咱們須要給xib綁定一個標識,即他View中對應的class是誰,就表明描述哪一個class。

 

Xib中owner的class是用來告訴xib中的View須要調用哪一個對象的方法,就填誰。好比須要調用dog類中的方法,就填dog。

 

注意:在連線選擇上別連錯了,

步驟一:先考慮本身是想給視圖添加控件了仍是想給視圖添加事件

步驟二:添加控件就跟xib中的view連線。添加一些事件就給xib中的File’s Owner 連線。

 

 

 

 

3.代碼順序問題

[UIView animateWithDuration:0.5 animations:^{

        CGRect  tmpFrame = sender.superview.frame;

        tmpFrame.origin.x = self.view.frame.size.width;

        sender.superview.frame = tmpFrame;

        sender.superview.alpha = 0;

    } completion:^(BOOL finished) {

        int index = [self.view.subviews indexOfObject:sender.superview];

        [sender.superview removeFromSuperview];

        [UIView animateWithDuration:0.2 animations:^{

            for (int i = index; i<self.view.subviews.count; i++)

            {

                UIView *chlid = self.view.subviews[i];

                CGRect tmp = chlid.frame;

                tmp.origin.y -=kViewH+1;

                chlid.frame =tmp;

            }

           

        }];

        // 在這判斷刪除按鈕是否容許點中,會在動畫執行完畢的時候,判斷。

        _removeIteam.enabled = self.view.subviews.count>1;

 

    }];

     // 而在執行代碼塊以外,判斷刪除按鈕是否容許點中是不對的,由於動畫是在後臺運行的,因此在執行動畫的時候,就已經執行完判斷語句了,而這時最後一個視圖還沒銷燬掉,所以刪除按鈕永遠不會不容許選中,也就不能在判斷刪除按鈕是否容許點中。

// _removeIteam.enabled = self.view.subviews.count>1;

 

 

刪完最後一行以後,正確的效果。

 

刪完最後一行以後,錯誤的效果。緣由,判斷的位置放錯了。

 

 

 

 

4.Xib描述視圖的時候,已經固定好描述視圖的寬高了,外界調用視圖的時候,只須要設置x,y值就行了

1.出現的問題,建立xib描述的視圖時,將寬度設置爲一個按鈕的寬度了,致使刪除按鈕不能點擊。

 

 

#pragma mark 添加聯繫人

- (IBAction)AddPerson:(UIBarButtonItem *)sender {

   

    NSString *imgName=[NSString stringWithFormat:@"01%d.png",arc4random_uniform(9)];

    NSString *labelName = arr[arc4random_uniform(arr.count)];

    RowView *rowView = [RowView rowViewWithIcon:imgName name:labelName];

    UIView *lastView = [self.view.subviews lastObject];

    int nextY = lastView.frame.origin.y + kSpace + kItemHW ;

    // 設置rowView的位置和尺寸

    CGRect cg =CGRectMake(0, nextY, kItemHW, kItemHW);

    rowView.frame=cg;

   

    [self.view addSubview:rowView];

}

錯誤緣由:設置rowView的寬度爲kItemHW,所以會有以上圖片的出現。

 

 

 

錯誤會致使刪除按鈕不能點擊,緣由:父視圖的尺寸不夠,即父視圖能接收事件的尺寸只有一點點,也就致使超出父視圖尺寸的子視圖不能監聽點擊事件。還有一點須要注意,將子視圖添加到父視圖尺寸以外的位置,只要還在屏幕上就會顯示子視圖,只不過它不能接收任何事件。

解決方法:CGRect cg =CGRectMake(0, nextY,rowView.frame.size.width , kItemHW);

  這樣設置就行了,由於xib裏面已經設置了rowView的尺寸了,外界不須要更改視圖的寬度了,直接獲取視圖的寬度便可。

正確效果:

 

 

5.    UIToolBar問題

注意UIToolBar中不能使用viewWithTag這個方法,獲取UIToolBar裏的子視圖。由於UIToolBar裏的子視圖都是UIBarButtonItem,而UIBarButtonItem是繼承NSObject的,所以不能使用viewWithTag獲取UIToolBar裏的子視圖,

viewWithTag:實現原理

- (UIView *)viewWithTag:(NSInteger)tag

{

       

// 1.若是當前tag和當前視圖tag相同,直接返回

if (self.tag == tag) return self;

  

    // 2.若是和當前視圖tag不相同,遍歷當前視圖的全部子控件,查找對應的tag。

for (UIView *view in self.subviews) {

   // 3.若是view不是UIView類或者UIView的子類直接返回nil

if (![view isKindOfClass:[UIView class]]) return nil;

        if (tag == view.tag) {

        //  4. 返回有相匹配的視圖

            return view;

        }

    }

    // 5.若是都沒有找到,返回nil.

    return nil;

}

     11.27常見問題

1.結構體和對象問題

// 這樣定義是錯的,結構體不是對象,聲明變量是不須要加*

CGRect *frame = self.view.frame;

結構體變量正肯定義:

CGRect frame = self.view.frame;

CGPoint center = self.view.center;

CGSize size = self.view.frame.size;

2.內存管理問題

       錯誤打印:

 

正確打印:

當對象被銷燬,必定會調用的方法,能夠用這個方法,判斷對象在何時銷燬,用這個調試。

 

 

 

 

3.建立模型的時候,儘可能自定義一個工廠方法供外界調用。

// 工廠方法,簡化對象的實例化

+ (id)provinceWithName:(NSString *)name;

 

工廠方法好處:簡化對象的實例化,快速建立對象。

4.非ARC內存管理問題。

有些同窗在建立項目的時候忘記點ARC了,致使一些成員屬性都莫名其妙的釋放了。而後出現了一系列莫名其妙的錯誤。

在滾動UITableView的時候出現野指針錯誤。

 

一出現這些野指針錯誤,首先應該想到某些對象被釋放了,而後發現代碼中,並無什麼形成對象被釋放的狀況,這時候應該立刻想到極可能是非ARC弄的。下圖爲怎麼查看項目是不是非ARC。

 

在非ARC中沒有強引用的概念,所以下圖的成員變量是沒有被強引用的。

 

在看看下圖,allPro數組沒有經過alloc調用,沒有調用alloc產生的對象都是自動釋放的

    allPro=@[

            @{

                kCities:@[@"浦東",@"楊浦",@"閘北",@"閔行"],

                kHeader:@"上海",

                kFooter:@"上海不錯"

            },

            @{

                kCities:@[@"海淀",@"昌平",@"天安門"],

                kHeader:@"北京",

                kFooter:@"北京很好"

             }

   

    ];

因此在滾動的時候會出現野指針錯誤,所以須要將項目改爲ARC。以下圖

 

 

兩個勾都得選中,而後一直點確認就OK了。

6.    數據模型屬性採用的策略中除了基本類型須要用assign,字符串須要用copy,其餘對象類型都須要用strong。而控制器中視圖採用的策略須要根據狀況而定。

下圖就是數據模型中屬性用錯了策略致使,UITableViewcell從新出現到界面時,會致使數據丟失。

 

 

 

11.29 常見問題

1.想在點擊cell時作些操做,方法選錯了。

下面兩個方法太類似了,很容易選錯。

// 當點擊一行cell時,會調用這個方法

-      (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

// 當取消選擇一行cell時,會調用這個方法

-      (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

 

2.字符串小調試技巧

當把一個字符串轉換成基本數據類型時,字符串打印有值,可是轉換成基本數據類型爲0時,這個莫名其妙的問題,首先應該想到字符串中極可能有換行符合等,致使轉換不成功。

 

NSString *str = @"                                                                                  123";

    NSInteger i = [str integerValue];

    NSLog(@"%@",str);

NSLog(@"%d",i);

碰到這種狀況,能夠在打印字符串的時候在佔位符兩邊各加一個數字.

        NSLog(@"1%@1",str);

而後看打印結果就能知道有字符串中有多少空行了

 

只要將空行去掉就能轉換成功了。

字符串去掉空格的方法

// 此方法是經過什麼字符集裁剪字符串。

- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;

 

NSCharacterSet對象能夠經過類方法建立

    // 建立空格和換行字符集

    [NSCharacterSet whitespaceAndNewlineCharacterSet];

    // 建立空格字符集

    [NSCharacterSet whitespaceCharacterSet];

3.下圖的警告意思是:初始化時,類型指向不匹配,應該用NSArray * 而不是YZPerson *

 

 

 

找到緣由後,而後看person方法是怎麼聲明。

 

解決方式:將NSArray * 改爲id。

 

11.30 常見問題

 

1.UITableView數據源問題

1.1

 

錯誤緣由:說YZViewController 沒有實現 tableView:numberOfRowsInSection:

解決方式:實現tableView:numberOfRowsInSection:

 

1.2

 

這裏返回空,會報錯。

UITableView內部實現原理:

數據源實現了這個方法

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

 

tableView內部自動會調用如下方法添加cell。

[tableView addSubview:cell];

 

若是返回的cell爲空,也就意味着生成下面一行代碼。

[tableView addSubview:nil];

而addSubview是將右邊參數添加到數組中保存起來,而數組是不能添加空值的。全部集合對象都不能出傳空。例如數組,字典,NSSet。

 

以上錯誤總結:做爲tableView的數據源必須實現兩個方法。

返回行數

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section;

返回每一行顯示的內容

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

另外返回每一行顯示的內容不能返回nil。

 

 

2.在數組刪除一個模型,並不表明把這個模型給釋放了。

 

上面步驟二,僅僅是將模型從數組中銷燬,而模型並無被銷。

 

12.1 常見問題

1.stroyboard中顯示的跟根視圖是UIView,而stroyboard的控制器是UITableViewController就會報這個錯誤

 

緣由是:UITableViewController控制器不能加載UITableView,由於它會去加載stroyboard中的UIView。

解決方式:將stroyboard中的UIView改爲UITableView

 

12.2 常見問題

1.自定義視圖的屬性命名衝突問題

 

當發現本身描述的xib和運行的時候展示出來的不同的時候,這時候已經想到本身命名的屬性名稱和系統命名的衝突了。

 

錯誤緣由

 

系統自帶的UITableViewCell中也有imageView這個屬性,所以衝突了。

解決辦法:將自定義視圖的imageView屬性名稱改爲iconView.

注意:之後自定義屬性命名不要和系統自帶的屬性名稱相同。

 

 

2.連接錯誤

 

之後看到duplicate這個詞語,錯誤緣由就是重複定義了類,函數方法等等。

通常都是由於導入了.m文件

錯誤:

解決方式:將#import "newsCell.m"這一行刪掉。

 

3.注意將以前storyboard中控制器刪除以後,拖入一個新的控制器的時候,stroyboard中控制器的class也要從新填入本身想要展現的控制器,告訴stroyboard去加載哪一個控制器。

 

 

12.3常見錯誤

1.初始化方法命名規範問題。

 

看見這個錯誤,應該要想到初始化方法命名錯誤的問題。由於self只能在init開頭的方法中賦值,init必須是一個獨立的單詞,所以init後的第一個字母必須大寫。

12.4常見錯誤

1.重寫set方法忘記賦值,之後重寫set方法,第一步就先賦值。

2.strong和weak亂用

通常狀況:代理和控件使用weak

其餘對象使用strong

基本數據類型 使用assign

12.5常見錯誤

1.QQ好友列表中,展開了列表,可是箭頭沒動畫。

緣由:因爲代理方法中從新刷新了表格,也就意味着把以前的頭部視圖給替換了,所以沒有動畫了,不要建立新的頭部,才能讓舊的頭部執行動畫

解決方法:用一個數組或者字典保存全部的頭部視圖,從新刷新的時候,直接取就OK了。

12.6 常見錯誤

1.加載xib時,名字是分大小寫的,注意名字必定要保持一致。

 

報錯緣由:xib是大寫的KeyboardTool,而加載的時候名字寫成小寫了。

解決方式:將加載的xib的名稱改爲大寫。

相關文章
相關標籤/搜索