1. 程式人生 > >載入帶有手勢識別器的XIB檔案時的注意事項

載入帶有手勢識別器的XIB檔案時的注意事項

  首先新建一個繼承自UIView的類,並建立相應的XIB檔案

#import <UIKit/UIKit.h>

@interface ZHDemoView : UIView

+ (instancetype)demoView;

@end

  提供一個類方法以供快速建立當前類

  在.m中實現類方法,通常從XIB中加載出來的是一個數組,所以用到了lastObject方法

+ (instancetype)demoView
{
    NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"ZHDemoView" owner:nil options:nil];
    return [nibArray lastObject];
}

  在awakeFromNib中新增相應的手勢

- (void)awakeFromNib
{
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(click)];
    [self addGestureRecognizer:tap];
}

- (void)click
{
    NSLog(@"%s", __func__);
}

  另外,測試用的XIB長這樣:

  在根控制器新增一個這樣的View,執行並點選,結果是

2015-08-11 13:44:44.988 XIB注意[1797:362096] -[ZHDemoView click]

  一切正常,接下來我們不在程式碼中新增手勢,直接在XIB中新增(之前新增手勢的程式碼已清除):

  執行結果:

2015-08-11 14:02:12.747 XIB注意[1962:374487] -[UITapGestureRecognizer superview]: unrecognized selector sent to instance 0x7fe47af49c60

  可以看到是訊息傳送錯誤,UITapGestureRecognizer中沒有superview方法。

  回到這張圖

  

  我們可以看到Objects欄下方有手勢識別器和DemoView兩個物件,那麼是否有可能是因為XIB載入的物件錯誤呢?

  因為之前提供的類方法中我們使用的是lastObject方法,這次我們使用firstObject試一試

  更改類方法如下:

+ (instancetype)demoView
{
    NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"ZHDemoView" owner:nil options:nil];
    return [nibArray firstObject];
}

  結果:

2015-08-11 14:13:16.847 XIB注意[2064:382058] -[ZHDemoView click:]

  一切正常。

結論:

  從XIB加載出來的是一個物件陣列,通常情況下,我們只需要用到一個物件,此時用firstObject或者lastObject皆可。但是當你要使用手勢識別器時,別弄錯你取出的物件。建議不要在XIB中直接新增手勢識別器,通過程式碼手動建立更穩妥和易於維護。

相關推薦

載入帶有手勢識別XIB檔案注意事項

  首先新建一個繼承自UIView的類,並建立相應的XIB檔案 #import <UIKit/UIKit.h> @interface ZHDemoView : UIView + (instancetype)demoView; @end   提供一個類方法以供快速建立當

Linux下vi編輯編輯檔案對於意外退出的文件的再次開啟的解決方案

1、當我們在虛擬機器裡面編輯檔案的時候,喜歡用vi編輯器,但是由於叢集的不穩定,或者自己開啟以後忘記關閉,切換到另一個介面繼續工作,當再次回來時候,已經失去了編輯的能力了。當我們再次開啟此檔案的時候就會出現如下介面:<--當時出錯忘了截圖了,只顧著解決呢,也是學習了一些

iOS私有API(三) UIWebView下的手勢識別gestureRecognizer

 首先,UIWebView本身之上並沒有手勢識別器(gesture recognizer,下面簡稱手勢),而是其子view有。 通過gdb或lldb,我們很容易看到UIWebView的subviews層級關係,下面是使用一個UIWebView開啟百度首頁時的情況: (lld

FTPClient 處理多個檔案注意新增completePendingCommand

<span style="font-family:Arial, Helvetica, sans-serif;">//樓主之前做一個專案對接,要求用到操作ftp檔案等功能,主要遇到的問題是當要遍歷資料夾裡的檔案時或者下載所有檔案時,如果沒有使用completePe

關於 類 Scanner掃描檔案注意事項

如果檔案或流有中文 ,如果用Scanner建構函式Scanner(File source) 則對File的掃描結果為空 ,呼叫 boolean hasNext() 方法會永遠返回false ;如果是 Scanner(In

Android Sqlite資料庫升級注意事項

在app版本升級時,同時升級了Sqlite資料庫的版本號的話,如果需要保留之前的資料,需要在onUpgrade方法中做處理。這裡記錄一下在onUpgrade處理升級的時候的一些注意事項。 先看下常用的SQLiteOpenHelper的方法: public class Database

SpringBoot開發詳解(三)--SpringBoot配置檔案YML注意事項

轉載自:https://blog.csdn.net/qq_31001665/article/details/70197543#commentBox 一、多重層級讀取 在YML中我們再新增一個ZZP2的配置資訊,其中包含了girl節點以及girl下的name,age屬性。 zzp2:

Java定時任務Timer排程【三】 注意事項(任務精確性與記憶體洩漏)

一、任務精確性 通過前兩節的分析,大概知道了Timer的執行原理,下面說說使用Timer需要注意的一些事項。下面是Timer簡單原理圖 從上圖可以看到,真正執行鬧鐘的是一個單執行緒。也就是說佇列中的鬧鐘,只能依次進行序列化的操作,鬧鐘的定時執行得不到保證。 比如下面的例子(本節所有

.NET MVC和.NET WEB api混用注意事項

1、同時配置了mvc路由和api路由時,mvc路由無法訪問(呼叫所有mvc路由全部404錯誤) 在Global.asax中,需注意路由註冊的順序,將api路由註冊放在最後: 即將 void Application_Start(object sender, EventArgs e)

讀取相對路徑下的.properties檔案內容注意事項

1、一般在網上搜的方法都是: public static void main(String[] args) throws IOException { Properties prop = new Properties(); InputStream in = Object.

Linux環境下使用VSCode編譯makefile檔案注意事項

Linux環境下使用VSCode編譯makefile檔案的注意事項 首先安裝C/C++的兩個依賴   在debug,launch會自動的生成下方的launch.json     launch.json { // Use IntelliSense to l

vue之watch監聽物件或者一個值注意事項(深度觀察deep:true慎用!)

vue中想在某個值改變的時候能夠做一些其他事情,可以使用其提供的監聽機制,使用watch。注意,本篇不講技術問題,只是講解如何應用,因為筆者也是一個前端的小白 例:經手專案中就有使用,截圖如下: 下面來分析上面分別是怎樣實現監聽的: 其實除了畫紅線的地方,別的都沒什

jupyter notebook配置檔案修改注意事項--遠端訪問

安裝 安裝完jupyter如果想要遠端訪問需要修改配置檔案,但安裝完之後不預設生成配置檔案需要執行: jupyter notebook --generate-config 控制端裡面會顯示建立配置檔案的路徑: 配置檔案是一個python原始檔,裡

安裝windows和ubuntu雙系統,安裝ubuntu注意事項

1.允許安裝第三方軟體圖形、硬體以及是否聯網更新(可選也可不選) 2.引導驅動裝置應選全盤即/dev/sda即可------這是Ubuntu的grub2引導;如果將引導驅動裝置放入分好的/boot區,則是由Windows引導。 3.當更新windows或者Ubuntu時,造成開機無法進入即找不到引導

ovirt掛載多儲存環境注意事項

我的測試環境如下 default資料中心+default叢集+NFS儲存 default叢集有node1和node2 新建FC叢集,並加入node3,然後掛載fc儲存 node1和node2沒有hba卡,並未連線到儲存,隸屬於不同叢集,但還是會報錯,看來儲存在同一資料中心

關於STM32定時使用的一個注意事項(以此為前車之鑑,重要!)

    我們平時使用定時器的時候多數都是處於開啟狀態,平時的定時中斷書寫格式一般是: void TIM3_IRQHandler(void) {if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET){TIM_ClearITPending

使用Spring + quartz叢集持久化注意事項

1、持久化時未序列化異常 java.io.NotSerializableException: Unable to serialize JobDataMap for insertion into database because the value of property '

在vs中使用qss檔案注意事項

解決辦法:在我的多次試驗下,漸漸發現,當把qss檔案作為資原始檔使用時,每次的結果都和第一次一樣,無論怎樣修改qss檔案。而且我輸出qss檔案的內容也和第一次編譯時一模一樣。期初我以為是因為vs只在第一次是完全編譯,而之後都是部分編譯,只要刪除編譯產生的結果即可使得執行結果發生變化,但試過之後才發現這樣也沒用

mybatis寫xml注意事項

mybatis寫xml時注意事項: 1. 如果資料庫欄位中有關鍵字,使用`關鍵字`,最好是隻要是欄位就用``符號,可以減少很多錯誤 2. 如果更新的欄位中有 時間戳,更新時,使用如下(加上jdbcType可以防止出錯): <if test="updateTime !=null"> &

JAVA中在main函式中呼叫變數注意事項

在下面這段程式碼中會報錯 [java] view plain copy print?System.out.println(s1);  System.out.println(s1);Cannot make a static reference to the non-static field s1 只要把