0

탭을 선택하고 현재 탭을 언로드 한 후 다음 탭을로드 할 때 한 번에 하나씩 만로드되도록하려면 어떻게해야합니까? 아니면 내가하지 않아야합니까? 루트 VC로 정상적인 UIViewController 함께 할 수 있지만 UITabBarController 확실하지 방법을 알고. 또한 한 탭에서 다른 탭으로 전환을 애니메이션화하는 방법이 있습니까? 어떤 도움이 필요합니까? 감사!!iPhone Dev - 탭 막대 앱을 느슨하게로드

편집 : 뷰 컨트롤러를 언로드하면 ... 다음 탭 표시 줄에 해당 아이콘이 사라 졌어요 ... 어쩌면 난 그냥 당신은 정말 UITabBarController가를 unfortunaly 그렇게 관리하지 못할

답변

1

의견을 .. 언로드 할 수 있습니다 당신은 게으른 로딩을 할 수 없다. 당신은 자신의 TabBar를 관리함으로써 할 수 있지만, 당신이해야 할 일은 ViewController에 TabBarItems를 설정하고, TabBar Delegate 프로토콜을 구현하는 것입니다. - 한 tabBar은 : didSelectItem : 편집 : 다음 tabbarItem 선택이 변경 될 때마다 새의 ViewController을로드하고 다른 사람에게 그래서를 해제 할 수있는 항목 ID를 기반으로 한 후, 호출 방법이 코드는 UIViewController에 간다

-(void)addTabBar{ 
    NSMutableArray* items=[[NSMutableArray alloc] init]; 
    UITabBarItem *eventsItem= [[UITabBarItem alloc] initWithTitle:@"Events" image:nil tag:0]; 
    UITabBarItem *albumItems=[[UITabBarItem alloc] initWithTitle:@"Album" image:nil tag:1]; //the tag is how you tell what was clicked 
    [items addObject:homeItem]; 
    [items addObject:albumItems]; 
     //MyTabBar is of type UITabBar 
    myTabBar=[[UITabBar alloc] initWithFrame:CGRectMake(0,411,320,49)]; 
    [myTabBar setItems:items]; 
    myTabBar.delegate=self; //you gotta implement the UITabBar delegate protocol 
    [myTabBar setSelectedItem:eventItem]; //set the selected item 
    [homeItem release]; 
    [eventsItem release]; 
    [albumItems release]; 
    [items release]; 
    [self.view addSubview:myTabBar] 
} 

프로토콜 메서드는 다음과 같습니다. - (void) tabBar : (UITabBar *) tabBar didSelectItem : (UITabBarItem *) ite 등 m { (item.tag == 0) { //이 항목이 관련된의 ViewController을로드하고 다른 사람 } 을 놓으면 ...

} 
+0

그래도 uitabbarcontroller를 재 작성하는 방법을 알고 있었기 때문에 내 탭 바를 관리해야했습니다. 어쩌면 내가 시도 할 수 ... – mk12

+1

전혀 열심히, 당신은 단지 하나의 방법을 구현해야 selectItem 않았다, 그리고 당신이 선택한 항목에 따라 매우 똑바로 앞으로 설정하고 게으른 로딩 할 수있는 그런 식으로 – Daniel

+0

그래서 당신은 내가 게으른로드 및 탭 표시 줄 또는 UITabBarController 사용하여 내 자신의 uiviewcontroller 클래스를 만들어야한다고 말하는? didSelectItem 메서드를 시도했지만 제대로 작동하지 못했습니다. – mk12

-1

확실하지 당신이 원하는 것 이유 이렇게하려면 메모리 문제가있는 경우 현재 탭이 언로드됩니다. 그게 -viewWillAppear, -viewDidUnload 등입니다.

+0

나도 알아,하지만 네가 보지 않는 한 빨리 사용하지 않는 것을 내리고 그걸 메모리 경고문에 집어 넣지 않는 편이 낫다고 생각했다. – mk12

+0

두 개의보기가있는 것처럼 단추를 눌러 전환 한 다음 다음 단추를로드하고 이전 단추를 제거한 다음 새 단추를 추가하고 이전 단추를 언로드하십시오. – mk12

+0

메모리 경고 시점에 이르면 캐시 된 사파리 페이지 등을 삭제하는 등 앱에 눈에 띄는 영향을 줄 수있는 다른 작업이 진행됩니다. – mk12

3

내가 한 두 질문에 대답 할 수 ...

이 당신은 단지 UITabBarController가 대리자 역할을하는 클래스가 필요

, 다음과 같이 방법을 구현 :

// Animate tab selections so they fade in and fade out 
-(void)tabBarController:(UITabBarController*)tbc didSelectViewController:(UIViewController*)newSelection 
{ 
    [UIView beginAnimations:@"TabFadeIn" context:nil]; 
    [UIView setAnimationDuration:0.6]; 
    for(UIViewController* vc in tbc.viewControllers) 
     vc.view.alpha = (vc==newSelection) ? 1 : 0; 
    [UIView commitAnimations]; 
} 

이제 내 코드는 간단하게 탭 막대가 페이드 인 및 페이드 아웃되지만 사용되지 않은 탭을 언로드하기 위해 여기에서 작업 할 수도 있습니다. 때로는 탭 중 일부에서 많은 양의 메모리를 사용한다면 좋은 생각입니다.

+0

전환을 움직이기로 결정한 경우 사용해 주셔서 감사합니다. – mk12

-1

UITabBarController는 모든 뷰 컨트롤러를 지연로드합니다. 탭이 전환되면보기가 메모리 부족 상황에서 할당 해제 될 수 있습니다. 그런 다음 두 번 뽑으면 다시 작성됩니다. 또한 대부분의 히트 메모리는 뷰 컨트롤러가 아니라 뷰 컨트롤러에 있습니다. 따라서보기 컨트롤러에서 발생하는 메모리에 대해 걱정하지 마십시오. 보기는 proze입니다.

OS의 v3에서 실행중인 경우 -viewDidUnload 메소드를 사용하여 최대한의 메모리를 줄일 수 있습니다.

앤드류

+0

예, "메모리 부족 상황"에서 발생하지만 한 번에 하나의보기 만 할당하거나 하나의보기 컨트롤러 만 사용하는 것을 선호합니다. UITabBarController 인스턴스 대신 루트 뷰 컨트롤러로 내 자신의 UIViewController 하위 클래 (UITabBar 함께) 사용하기로 결정했습니다.이 방법으로 모든 것을 제어하고 진행 상황을보다 효율적으로 알 수 있기 때문입니다. – mk12

+0

그리고보기 컨트롤러를 할당 해제하면보기가 할당 취소됩니다. – mk12

1

지연로드는 UITabBarController 작업이 아닙니다. 대신 Tab과 관련된 viewController의 책임입니다.

각 UIViewController와 연결된 UIView를 해제하려면 TabBarItem을 변경할 때마다 UITabBarController와 연결된 각 UIViewController 하위 클래스에서 다음 메서드를 구현해야합니다.viewControllers 속성 :

-(void)viewDidDisappear { 
[self.view removeFromSuperview]; 
self.view = nil; 
} 

분명히 말해서 UIViewController와 관련된 self.view가 제거됩니다. 그러나 코드가 충분히 똑똑하다면 관련된 모든 객체가 제거됩니다. 예를 들어,에는 loadView 방법은 다음과 같다 있다고 가정 :이있는 contentView과 메모리 responsabilities 내의 모든 객체에서,있는 contentView에 요구되는이 self.view 속성에 출시과 연결되어 있음을 의미

-(void)loadView { 
UIView *contentVew = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
self.view = contentView; 
… 
... 
UILabel *aLabel = [[UILabel alloc] initWithFrame:CGRectMake(0,0,320,50)]; 
… 
… 
[contentView addSubview:aLabel]; 
[aLabel release]; 
… 

[contentView release]; 
} 

.

이 시나리오에서는 self.view (즉, contentView에 대한 참조)를 제거하여 모든 객체의 도미노 스타일을 릴리스하는 것이 목표입니다.

안부

나는 현재이 탭 표시 줄에서 비활성 뷰 컨트롤러를 언로드 사용하고
-1

(켄달의 답변에 따라)

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController: (UIViewController *)viewController { 
    // reload all inactive view controllers in the tab bar 
for (UIViewController *vc in tabBarController.viewControllers) { 
    if(vc != viewController) 
    [vc didReceiveMemoryWarning]; 

} } 내가 말을하지 않았다

+0

이것은 목표를 달성하기 위해 메소드의 현재 구현의 부작용을 사용하는 잘못된 코딩 스타일입니다. didReceiveMemoryWarning의 구현은 변경 될 수 있으며 행동에 대한 가정을 깨뜨릴 수 있습니다. 동작이 명확하지 않아서 디버그하기도 어렵습니다. – ikuramedia