2014-03-31 70 views
1

我有一個將UIView元素添加到另一個父級UIView的線程。我試圖每秒添加一個,但是直到整個循環完成後才顯示它們。請參閱下面的代碼。添加到子視圖中的項目不會增量顯示

-(void)buttonClicked:(id)sender { 
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(addSubViews) object:nil]; 
    [thread start]; 
} 

-(void)addSubViews { 
    for(int i = 0; i < 10; i++) { 
     UIView *view = [[UIView alloc] initWithFrame:CGRectMake(i, 0, 10, 10)]; 
     [parentView addSubview:view]; 
     [NSThread sleepForTimeInterval:1]; 
    } 
} 

我期望看到這些視圖一次添加一個,每1秒鐘一次。然而,在整個循環完成之前,父視圖中沒有任何顯示。有任何想法嗎?

回答

0

Gack。忘記你曾經知道睡眠。真。

你不能從後臺線程做UI代碼。

直到下一次通過事件循環才能更改應用的UI。您需要返回並讓系統處理您的代碼。更多的東西是這樣的:

標題:

@interface MyVC: UIViewController 
{ 
    int viewIndex; 
} 

身體:

#define K_MAX_VIEWS 10 

@implementation MyVC 

-(void)buttonClicked:(id)sender 
{ 
    viewIndex = 0; 
    [self addViews]; 
} 

- (void) addViews; 
{ 
    if (viewIndex < K_MAX_VIEWS) 
    { 
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(i*15, 0, 10, 10)]; 
    [parentView addSubview:view]; 
    view.layer.borderWidth = 1.0 //Testing: Box the view so you can see it. 
    viewIndex++; 
    [self performSelector: @selector(addViews) withObject: nil afterDelay: 1]; 
    } 
} 
@end 


此代碼使用實例變量來跟蹤它添加視圖的索引。它添加了一個視圖,然後在撥打performSelector:withObject:afterDelay:後返回。此方法延遲後調度主線程的未來呼叫。這就是你想要處理這個問題的方法。

請注意,作爲此代碼的結果,您可能不會看到任何東西,除非您將視圖添加到顯示視圖中。這就是爲什麼我添加了行view.layer.borderWidth = 1.0

0

UIKit不是線程安全的,因此所有對它的調用都必須在主線程上進行。試試這個:

-(void)addSubViews { 
    for(int i = 0; i < 10; i++) { 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      UIView *view = [[UIView alloc] initWithFrame:CGRectMake(i, 0, 10, 10)]; 
      [parentView addSubview:view]; 
     }); 
     [NSThread sleepForTimeInterval:1]; 
    } 
} 
0

不要使用NSThread,使用GCD。例如:

-(void)buttonClicked:(id)sender { 
    [self addSubViews]; 
} 

-(void)addSubViews { 

    for (int i = 0; i < 10; i++) { 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     UIView *view = [[UIView alloc] initWithFrame:CGRectMake(i, 0, 10, 10)]; 
     [parentView addSubview:view]; 
     [NSThread sleepForTimeInterval:1.0]; 
    }); 

    } 
} 

說明:您將10個異步任務添加到子視圖並等待1秒鐘到主隊列。

相關問題