【问题标题】:Navigate/Swipe between articles in section using table view controller使用表格视图控制器在部分文章之间导航/滑动
【发布时间】:2015-09-15 15:15:15
【问题描述】:

我有一个简单的应用程序,它有表格视图控制器,其中包含几篇文章,例如运动版3篇:

当我打开本节中的特定文章时,我希望能够向左滑动以移动到本节中的下一篇文章,
我该怎么做?

【问题讨论】:

    标签: ios swift uitableview


    【解决方案1】:

    这对我有用。

    • 我有一个显示许多数据单元格的表格视图
    • 点按单元格以转到详细视图控制器,显示单元格中的更多数据
    • 向左滑动可有效刷新详细视图控制器,其中包含来自下一个单元格的数据
    • 在我的应用程序中,数据位于单例中,因此任何视图都可以从单例中的数据结构中检索该数据。仅供参考:数据结构由 API 调用填充,该 API 调用返回解码为数据结构的 JSON。

    当检测到向左滑动时,会调用 handleTap。 productNumberInPage 递增。这是从 NetworkManager 单例中查找数据的索引。这不是必需的,只是我的实现。

    productNumberInPage 递增后,调用 setupViews。这导致页面被新数据刷新。您也可以在此处添加动画。

    为了实现,在细节视图控制器中添加一个手势识别器,它调用细节视图控制器中的 setupViews 函数。

    class ProductDetailVC: UIViewController {
    
      // MARK: - Variables
      var productNumberInPage = 0
    
      // MARK: - IBOutlets
      @IBOutlet weak var productNameLabel: UILabel!
      @IBOutlet weak var reviewRatingLabel: CosmosView!
      @IBOutlet weak var reviewCountLabel: UILabel!
      @IBOutlet weak var productImage: UIImageView!
      @IBOutlet weak var priceLabel: UILabel!
      @IBOutlet weak var freeShippingLabel: UILabel!
      @IBOutlet weak var inStockLabel: UILabel!
      @IBOutlet weak var shortDescription: UITextView!
      @IBOutlet weak var longDescription: UITextView!
      @IBOutlet weak var contentView: UIView!
    
      // MARK: - Functions
      override func viewDidLoad() {
        super.viewDidLoad()
        let recognizer: UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(recognizer:)))
        recognizer.direction = .left
        self.view.addGestureRecognizer(recognizer)
        setUpView()
      }
    
      func setUpView() {
        guard let products = NetworkManager.instance.allProducts[pageWithTV].products else { return }
        productNameLabel.text = products[productNumberInPage].productName ?? "N/A"
        self.reviewRatingLabel.rating = products[productNumberInPage].reviewRating ?? 0
        reviewCountLabel.text = "\(products[productNumberInPage].reviewCount ?? 0)"
        priceLabel.text = products[productNumberInPage].price ?? "N/A"
    
        shortDescription.text = (products[productNumberInPage].shortDescription ?? "Not available.").html2String
        longDescription.text = (products[productNumberInPage].longDescription ?? "Not available.").html2String
    
        if let inStock = products[productNumberInPage].inStock, inStock {
            inStockLabel.text = IN_STOCK
            inStockLabel.textColor = ColorPalette.Green.Medium
        } else {
            inStockLabel.text = OUT_OF_STOCK
            inStockLabel.textColor = ColorPalette.Red.Medium
            freeShippingLabel.textColor = ColorPalette.White.Medium
        }
    
        image from a URL
        let image = UIImage(named: LOADING_IMAGE)
        guard let url = products[productNumberInPage].productImage else { return }
        DispatchQueue.main.async {
            self.productImage.kf.setImage(with: url, placeholder: image)
        }
      }
    
    
      @objc func handleSwipe(recognizer : UISwipeGestureRecognizer) {
            guard productNumberInPage != (PAGE_SIZE - 1) else {
                print("Sorry out of products on this page. Go back to list view")
                return
            }
            productNumberInPage += 1
            setUpView()
        }
    }
    

    【讨论】:

      【解决方案2】:

      基本上,你需要创建

      • 您的文章的全局存储,我们称之为articles。 根据articles,您可以填写您的tableView
      • 向您打开的文章页面添加滑动手势识别器
      • 每当您从右向左滑动时,都会将一个新的视图控制器推送到您的导航堆栈,并使用 articles 的下一项设置此视图控制器。

      【讨论】:

      • 谢谢,我有一个全局文章 var,如何推送新的视图控制器?
      • @DorCohen 如果您的应用程序中还有导航控制器,您应该将您的 tableview 控制器嵌入其中,然后您应该使用 pushViewController:animated: 方法将您的视图控制器推送到导航堆栈。