2009-10-06 14 views
1

在我的iPhone應用程序中,視圖在轉換時通常會緩慢加載,就像用戶單擊Tab Bar Controller上的按鈕一樣。如果手機內存不足,則會發生這種情況。它在3GS手機上並不真正出現,但這是3G手機的一個大問題。在3G iPhone上的視圖之間切換時視圖加載速度緩慢 - 如何更改我的風格?

我懷疑我沒有遵循創建UIViewControllers的一些最佳實踐。我想我可能在init函數中做得太多了,而不是使用viewDidLoad函數或其他東西。這似乎影響了我所有的觀點,所以我認爲這是我的風格問題,而不是一些特定的片段。

誰能告訴我我可能會做錯什麼?下面是一個示例代碼,來自一個UIViewController子類:

編輯:在迴應這個問題:「這是被稱爲?

當用戶點擊地圖上的標記這個函數被調用在這種情況下:

if(marker.label.tag == SavedBookmarkTag) { 

    SavedDetailScreen *savedBookmark = [[[SavedDetailScreen alloc] initBookmarkView: 
    [(NSDictionary *)marker.data objectForKey:@"bookmark"]]autorelease]; 
    [savedBookmark showMap]; 
    [self.navBar pushViewControllerWithBackBar:savedBookmark]; 
    return; 

} 

編輯完

-(id)initBookmarkView: (Bookmark *)bm { 

    self = [self initView]; 
    self.bookmark = bm; 

    primaryLabel.text = [bm title]; 
    secondaryLabel.text = [self getLineWithLat:[bm lat] AndLon:[bm lon] AndDate:[bm timeCreated]]; 
    return self; 

} 


- (id)initView { 

    self = [super init]; 
    self.isWaypoint = NO; 

    UIImageView *bg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"238-beveled-background.png"]]; 

    bg.frame = CGRectMake(0, 0, 320, 376); 
    [self.view addSubview:bg]; 
    bg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"small-label.png"]]; 
    [self.view addSubview:bg]; 
    [bg release]; 

    self.primaryLabel = [[UILabel alloc]init]; 
    primaryLabel.font = TITLE_FONT; 
    primaryLabel.backgroundColor = [UIColor clearColor]; 
    primaryLabel.textColor = LIGHT_BLUE; 

    self.secondaryLabel = [[UILabel alloc]init]; 
    secondaryLabel.font = TEXT_FONT; 
    secondaryLabel.backgroundColor = [UIColor clearColor]; 
    secondaryLabel.textColor = LIGHT_BLUE; 
    secondaryLabel.lineBreakMode = UILineBreakModeClip; 

    self.thirdLabel = [[UILabel alloc]init]; 
    thirdLabel.font = TEXT_FONT; 
    thirdLabel.backgroundColor = [UIColor clearColor]; 
    thirdLabel.textColor = LIGHT_BLUE; 
    thirdLabel.lineBreakMode = UILineBreakModeCharacterWrap; 

    [self.view addSubview:primaryLabel]; 
    [self.view addSubview:secondaryLabel]; 
    [self.view addSubview:thirdLabel];  

    self.loadingBackground = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"stats-box.png"]]; 
    loadingBackground.frame = CGRectMake(0, 115, loadingBackground.frame.size.width, loadingBackground.frame.size.height); 
    [self.view addSubview:loadingBackground]; 
    [self.view sendSubviewToBack:loadingBackground]; 

    AnimatedGif *animatedGif = [[[AnimatedGif alloc] init] autorelease]; 
    NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"35" ofType:@"gif"]]; 
    [animatedGif decodeGIF: data]; 

    UIImageView *loadingImage = [animatedGif getAnimation]; 
    loadingImage.frame = CGRectMake(150,150,loadingImage.frame.size.width,loadingImage.frame.size.height); 

    [loadingImage startAnimating];  
    [loadingBackground addSubview:loadingImage]; 
    [loadingImage release]; 

    [self layoutSubviews]; 

    return self; 

} 


- (void) layoutSubviews { 

    self.view.frame = CGRectMake(0,0,320,372); 
    primaryLabel.frame = CGRectMake(30, 30, 260, 18); 
    secondaryLabel.frame = CGRectMake(30 ,52, 260, 16); 
    thirdLabel.frame = CGRectMake(30, 72, 260, 16); 

} 
+0

問題:self.view在哪裏設置?在.xib中,或在其他方法?另外,什麼叫initBookmarkView? – cduhn 2009-10-07 01:36:14

回答

1

,你可以看到大概是緩慢歸因於構建對象和從閃存讀取數據都是昂貴的過程。尋找重複使用現有對象而不是多次構建它們的機會,並考慮延遲特別昂貴的操作,直到顯示視圖之後。

在這種情況下,我會與一對夫婦的變化開始:

  1. 讓savedBookmark一個成員變量,這樣就可以建構一次和重用。將您的initBookmarkView:方法替換爲一個setBookmarkView:方法,您可以在構造該成員變量之後調用該方法,以重新配置要顯示的特定書籤的標籤。

  2. 將子視圖創建代碼從initView中取出並放入loadView中。這是以編程方式構建自己的視圖層次結構的最合適的地方。 UIViewController在其視圖屬性上實現延遲加載,以儘可能延遲構造。視圖屬性是零,直到它第一次被請求。此時UIViewController調用loadView來設置屬性。如果定義了一個nib文件,默認的實現會加載該視圖。否則,它只是構造一個空的UIView並使其成爲主視圖。請注意,您必須構建容器視圖並自己設置視圖屬性。

在其他應用程序,你可以通過移動一些初始化代碼到viewDidLoad中:,被裝載在視圖屬性後調用,無論是編程或從筆尖得到一些改善。如果您從遠程URL加載圖像的操作非常緩慢,則可能需要開始在viewDidLoad中異步加載數據,然後在數據加載完成後更新子視圖。在某些情況下,您可能還想推遲一些代碼,直到viewDidAppear :.請注意,每次出現視圖時都會調用此方法,與loadView和viewDidLoad不同,它只調用一次。