在加载时设置UINavigatioController tabBarItem

时间:2017-01-09 17:41:06

标签: ios swift uinavigationcontroller uitabbarcontroller

在我的项目中,基本视图是 UITabBarController 。它连接到 UISplitViewController UINavigationViewController 。我想以编程方式设置 tabBarItem 的图标。我尝试的第一种方法是在 UITabBarController 的子类中设置它们。它没用。接下来,我尝试对每个连接的视图进行子类化,并在每个视图的 viewDidLoad 方法上设置 tabBarItem ,如下所示:

enter image description here

bool maze[20][20];

void initMaze()
{
    for(int i = 0; i < 20; i++)
        for(int j = 0; j < 20; j++)
            maze[i][j] = false;

    for(int i = 0; i < 20; i++)
        maze[0][i] = true;

    for(int i = 0; i < 20; i++)
        maze[19][i] = true;

    for(int i = 0; i < 20; i++)
        maze[i][0] = true;

    for(int i = 0; i < 20; i++)
        maze[i][19] = true;
}

int randNum(int min, int max)
{
    return rand()%(max-min+1)+min;
}

void drawVWall(int minY, int maxY, int x)
{
   int passage = randNum(minY, maxY);

    for(int i = minY; i <= maxY; i++)
        if(i != passage)
            maze[i][x] = true;
}

void drawHWall(int minX, int maxX, int y)
{
    int passage = randNum(minX, maxX);

    for(int i = minX; i <= maxX; i++)
        if(i != passage)
            maze[y][i] = true;
}

void divison(int x, int y, int maxx, int maxy, int h)
{
    if(h)
    {
        if(maxx <= 2)
            return;

        int wallY = randNum(y, maxy);
        drawHWall(x, maxx, wallY);

        if(wallY < maxy - wallY)
            divison(x, wallY, maxx, maxy, !h);
        else if(wallY > maxy - wallY)
            divison(x, y, maxx, wallY, !h);
    }
    else
    {
        if(maxy <= 2)
            return;

        int wallX = randNum(x, maxx);
        drawVWall(y, maxy, wallX);

        if(wallX < maxx - wallX)
            divison(wallX, y, maxx, maxy, !h);
        else if(wallX > maxx - wallX)
            divison(x, y, wallX, maxy, !h);
    }
}

initMaze();
divison(2, 2, 18, 18, true);

要显示的默认视图是 splitView 。加载应用后,它会显示 tabView tabBarItem ,但在用户未单击其他标签栏项目之前,它是空的。

在点击第二个标签栏项目之前:

enter image description here

点击第二个标签栏项目后:

enter image description here

1 个答案:

答案 0 :(得分:1)

在您实际显示第二个视图后,未加载第二个视图。它以“懒惰”模式加载 - 就在它第一次访问时。 这是一个优化,在应用程序启动时没有出现巨大的加载峰值,对于最初看不到的东西。

将代码添加到两个类的- (id)initWithCoder:(NSCoder*)aDecoder函数中 - 当为UITabBarViewController中的每个UIViewController加载应用程序时调用它。 向前迈进一步,以防万一有人通过代码初始化你的ViewControllers - 尽管有初始化方法,最好的方法是使用单独的函数来配置这样的东西 - 尽管有初始化方法。

class BaseSplitViewController: UISplitViewController {
    override init(frame: CGRect) {
        super.init(frame: frame)
        configureViewController()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        configureViewController()
    }

    private func configureViewController() {
        let searchIcon = UIImage.fontAwesomeIcon(name: .search, textColor: UIColor.black, size: CGSize(width: 40, height: 40))
        let baseSplitViewBarItem = UITabBarItem(title: "Search", image: searchIcon, selectedImage: searchIcon)
        self.tabBarItem = baseSplitViewBarItem
    }
}