2012-01-10 58 views
0

我正在研究iOS應用程序。基本上,我的應用程序的一部分有一個大的滾動視圖,其他6個滾動視圖添加爲子視圖(使用方法[scrollView addSubview:object.view]),以便它在6個不同的滾動視圖之間切換。每個滾動視圖都有一些我需要保存內容的文本視圖。 在每個子滾動視圖中,我向鍵盤添加了一個inputAccessoryView來添加一個Done按鈕,並且當按下此按鈕時我想調用一個方法來保存數據,然後刪除鍵盤(後者我已經完成了,我只需要弄清楚保存部分)。 我覺得在我的'超級'滾動視圖中有一個方法可以更容易地保存所有的數據,所以我可以在每個子滾動視圖中添加幾行代碼(順便說一句,這些子滾動視圖不是' t從主scrollview分類,它們是UIViewController的子類,所以我不能只使用super),因爲我必須將其複製/粘貼到6個不同的文件中。我可以通過在'sub'滾動視圖中導入並創建一個新對象來訪問'超級'類(具有其他所有其他類的大滾動視圖),但我覺得這不是我應該做的。這導致我進入我的下一個問題。 如果以這種方式訪問​​更大的滾動視圖,試圖訪問UITextViews的text屬性將返回null,而從子滾動視圖的類中訪問相同的屬性將顯示文本。訪問將scrollview作爲子視圖和其他一些問題添加的類

請讓我知道我是否做了一件完全錯誤的事情,因爲我覺得有6種不同的滾動效果真的是效率低下(但在兩個iPod touch,第二代和第四代測試它,沒有太多滯後在所有所以也不能太低效,否則它會養豬的內存,使其滯後,右)

感謝, 李

編輯:? 我仍然有這個麻煩。我創建的按鈕是以編程方式創建的,所以我無法將其鏈接到Interface Builder中的第一響應者。有沒有辦法以編程方式做到這一點?這是我創建inputAccessoryView的代碼:

-(void)createInputAccessoryView{ 
inputAccView = [[UIView alloc]initWithFrame:CGRectMake(10.0, 0.0, [[UIScreen mainScreen] bounds].size.width, 40.0)]; 
UIToolbar *toolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0.0, 0.0, 320.0, 40.0)]; 
UIBarButtonItem *doneBttn = [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(endEdit:)]; 
[toolbar setItems:[NSArray arrayWithObject:doneBttn]]; 
[inputAccView addSubview:toolbar]; 
[toolbar release]; 
[doneBttn release]; 
} 

該按鈕指向一個將關閉鍵盤的方法(在同一個類中)。但是,在關閉鍵盤之前,我需要調用另一種方法來保存數據(這是在不同的類中)。這是否有助於任何人的理解?

+3

我會建議您減少這個問題的大小,並嘗試將其分解成多個問題和/或重新組織它。沒有人希望篩選出一段文字,並試圖想象你在做什麼。 – david 2012-01-10 02:11:29

回答

0

發佈問題時,顯示您的代碼。不要只是描述你的代碼。當我們看到你在說什麼而沒有篩選出你認爲重要的東西時,我們更容易幫助你。

不過,我想我知道你在做錯什麼,以及如何幫助你。你說這樣的:

我能夠在「子」滾動型導入,並創建一個新的對象來訪問「超級」類(具有所有其他的在它的大滾動型)...試圖訪問UITextViews的文本屬性返回null

這聽起來像你已經把這個在你的孩子滾動視圖:

- (IBAction)saveButtonWasPressed:(id)sender { 
    ParentScrollView *parent = [[ParentScrollView alloc] init]; 
    [parent saveEverything]; 
} 

,然後你預期這個新創建的父滾動視圖上癮直至您現有的文本視圖。但爲什麼要連接?從nib加載視圖層次結構時,nib加載器會負責使用Interface Builder建立的連接。但是,如果您使用代碼創建視圖,則必須自己建立連接,而不是。

反正你不應該創建一個新的父滾動視圖。您需要發送一條消息到現有的父滾動視圖。有幾種方法可以做到這一點。在這種情況下,我建議使用響應者鏈。

您可以在Cocoa Application Competencies for iOS中閱讀關於應答鏈的內容。以下是此問題的重要概念:

  • 當文本視圖處於活動狀態時,文本視圖是鏈中的第一個響應者。
  • 該文本視圖的每個祖先視圖都在鏈中。

您可以掛鉤一個按鈕,發送事件了當按鈕被觸摸響應鏈:

  • 在Interface Builder中,您只需按鈕連接到「急救員」佔位符(在窗口的左上角區域)。您需要在源代碼中定義IBAction,以便在將按鈕連接到First Responder佔位符時顯示IBAction

  • 在代碼中,你使用nil作爲addTarget:action:forControlEvents:目標參數,如:

    [self.saveButton addTarget:nil action:@selector(saveEverything:) forControlEvents: UIControlEventTouchUpInside]; 
    

如果你勾你的按鈕了這種方式,UIKit的將搜索響應鏈的護理響應saveEverything:消息的第一響應者。在你的情況下,這應該是你的(現有的)父滾動視圖。

還有一件事:父滾動視圖不是真的把你的保存代碼的正確位置。在MVC設計模式中,控制器更合適。幸運的是,如果一個視圖有與之相關的UIViewControllerUIViewController也是響應者鏈中的。所以你可以把你的saveEverything:方法放在你的視圖控制器上,而不是你的父滾動視圖。

+0

感謝您提供的信息,它幫助我瞭解我做錯了什麼。一些事情,但。我無法連接IB中的按鈕,因爲我以編程方式創建它(因爲它位於inputAccessoryView中)。另外,我也沒有真正的視圖控制器。我開始我的項目爲基於視圖,但後來改爲基於標籤(我進入mainWindow.xib並刪除了視圖控制器,並添加了一個標籤欄),所以我的舊viewcontroller類是包含我的父母的視圖滾動視圖。 我可以創建一個僅用於數據保存目的的控制器嗎?如果是這樣,我該怎麼做呢? – Lee 2012-01-10 20:54:51

+0

我剛剛在閱讀您的文章時才意識到的一件事。我真的不想設置方法將所有內容保存到「完成」按鈕,我寧願從另一個方法中調用save everything方法,因爲它必須將鍵盤作爲第一響應者。 如果您希望看到我的代碼的特定區域,只需詢問併發布即可。 – Lee 2012-01-11 23:53:27

相關問題