Rubymotion:使用collectionView作为tabbar项

时间:2015-09-08 05:03:34

标签: ios rubymotion

我使用主视图,屏幕底部有一个TabBar。 每个选项卡项应该指向特定的CollectionView(具有特定的API调用)。

为了能够访问UICollectionViewController,必须先进行初始化。 所以我用过:

@main_controller = UITabBarController.alloc.init
layout = UICollectionViewFlowLayout.alloc.init
@main_controller.setViewControllers([
        GeolocScreen.alloc.init,
        ByNameController.alloc.initWithCollectionViewLayout(layout)
])
self.navigationController.pushViewController(@main_controller, animated:true)

话虽如此:

如果未将PM ::屏幕用作标签项,则不会显示标签图标和标签文本。这意味着,我必须单击图标以在标签栏中显示图标/文本

然后我尝试调用PM :: Screen而不是直接调用UICollectionViewController,并将其作为子视图。 但我没有设法做到这一点。

当我在PM :: Screen中使用

layout = UICollectionViewFlowLayout.alloc.init
ctrl = ByNameController.alloc.initWithCollectionViewLayout(layout)
append!(ctrl, :ctrl_style).get

我得到了

  

终止app到期        未被捕获的异常' NoMethodError',原因:' subviews.rb:229:在create_view :: undefined method<对于   ByNameController:0x1104fa050> (NoMethodError)

当我在PM :: Screen中使用

layout = UICollectionViewFlowLayout.alloc.init
screen = ByNameController.alloc.initWithCollectionViewLayout(layout)
view = UIView.alloc.init
view.append(screen.view)

点击图标不会做任何事情。我从不输入viewWillAppear,我认为这是合乎逻辑的,因为控制器只是附加...但我的数据没有被加载。

如果你有想法,我一定会错过一些明显的东西......谢谢!

PS:以防万一;我的控制器

class ByNameController < UICollectionViewController
  attr_accessor :data

  COLLECTION_CELL_ID = "ArtCell"
  COLLECTION_HEADER_ID = "SectionHeader"

  def viewDidLoad
    super
    self.title = App.name

    rmq.stylesheet = CollectionStylesheet

    collectionView.tap do |cv|
      cv.registerClass(ArtCell, forCellWithReuseIdentifier: COLLECTION_CELL_ID)
      cv.delegate = self
      cv.dataSource = self
      cv.allowsSelection = true
      cv.allowsMultipleSelection = false
      rmq(cv).apply_style :collection_view
    end
reload_data
  end
  def reload_data
    mp "RELAODING DATA "
    Api.shared.url ".........json"
    Api.shared.file_name "content.json"
   Api.shared.download_data

  end
def viewWillDisappear(animated)
    App.notification_center.unobserve @reload_observer
  end

def viewWillAppear(animated)
    super
    @reload_observer = App.notification_center.observe 'ReloadDataNotification' do |notification|
      self.data = Api.shared.hash
      self.collectionView.reloadData
    end
  end

  def collectionView(view, numberOfItemsInSection: section)
    self.data.nil? ? 0 : self.data["items"].reject{|i| i['name'] == "" }.count
  end

  def collectionView(view, cellForItemAtIndexPath: index_path)
    view.dequeueReusableCellWithReuseIdentifier(COLLECTION_CELL_ID, forIndexPath: index_path).tap do |cell|
      rmq.build(cell) unless cell.reused
      art = {
        art: self.data["items"][index_path.row]["art"],
        name: self.data["items"][index_path.row]["name"],
        thumb: self.data["items"][index_path.row]["thumb"]
      }
      cell.art = art
    end
  end

  def collectionView(view, didSelectItemAtIndexPath: index_path)
    selected = self.data["items"][index_path.row]
    @store = StoreInfoController.alloc.init
    @store.store_id = selected["storeID"]
    self.navigationController.pushViewController(@store, animated:true)
  end

  end

1 个答案:

答案 0 :(得分:0)

要自定义UIViewController的标签栏项,请使用tabBarItem属性:

https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/instp/UIViewController/tabBarItem

PM ::屏幕在这里没有任何事情可做。它只是UIViewController的子类,与UICollectionViewController的方式相同。