Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 7

0
votes
answers
36 views
+10

如何防止tableview節頭在滾動時粘住?

2

我有許多部分的tableview。我正在使用一個實際的tableview單元格,我將其作爲自定義節標題使用。我遇到的問題是當我滾動部分標題「棒」到表的頂部,直到下一部分出現。如何防止tableview節頭在滾動時粘住?

我怎樣才能防止這種情況發生,實際上讓它像正常一樣向上滾動?

這裏是我的代碼

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    if section == 3 { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "headerCell") as! HeaderTableViewCell 
     return cell 
    } 
    return UIView() 
} 
+0

[UITableView的固定欄目標題]的可能的複製(https://stackoverflow.com/questions/17582818/uitableview-with-fixed-section-headers) – Larme

+0

這有點幫助,但是現在我不希望我的tableview被分組,因爲它使它看起來不同(有點像設置應用程序)。 – user7097242

沙发
0
0

一些可能的解決方案:

  1. 如果你有那麼只有一個部分泰伯維標題屬性設置爲你想要設置爲分節標題UIView的。
  2. 如果您有多個部分,請將每個部分的行數更改爲(該部分的行數+1),並將第0個索引處的行設爲標題。一些手工編碼將是必需的。
  3. 更改你的tableview分組,將需要重新設計UI,使設計看起來類似於普通的tableview單元格。
板凳
0
0

而不是UIHeaderViewCell,您應該使用UITableViewCell。將節標題高度設置爲0,併爲該節中的每個第零項顯示一個標題爲UITableViewCell的標題

地板
0
0

UITableViewStyle設置爲,標題將向上滾動單元格。 和

func tableView(_ tableView: UITableView, 
heightForFooterInSection section: Int) -> CGFloat 
{ 
    return 0.000001; 
} 
0
votes
answers
39 views
+10

未在單元格內顯示JSON響應

-1

我正在創建Tableview並嘗試在單元格中包含一個通過API從JSON接收的信息。 信息(JSON)收到的很好,並在變量內正確記錄。 但是,我可以發現的是,由於收到的信息帶有一個小的「延遲」,因此不會在單元格創建時刻將單元格的標籤文本設置爲默認變量內容。 我想解決的辦法是在解析JSON內容的時刻更新標籤,對吧?我該怎麼做呢? (更新單元格的標籤後,它已被創建) 任何其他洞察力/解決方案非常感謝。未在單元格內顯示JSON響應

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, AddStock { 

    let operacoesAcoes = ListaOperacoes() 
    var todasAsOperacoes : [Operacao] = [] 

    @IBOutlet weak var acoesTableView: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     acoesTableView.delegate = self 
     acoesTableView.dataSource = self 
     acoesTableView.register(UINib(nibName: "StandardStockListCell", bundle: nil), forCellReuseIdentifier: "standardCell") 
     operacoesAcoes.consolidaAcoes() 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return operacoesAcoes.carteiraAcoes.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "standardCell", for: indexPath) as! StandardStockListCell 
     let informacaoCompletaAcao = operacoesAcoes.carteiraAcoes[indexPath.row] 

     cell.codigoTextField.text = informacaoCompletaAcao.codigoAcao 
     cell.nomeTextField.text = informacaoCompletaAcao.nomeAcao 
     cell.quantidadeTotal.text = String(informacaoCompletaAcao.quantidadeTotal) 
     cell.precoMedioLabel.text = String(format: "%.2f", informacaoCompletaAcao.precoMedio) 

     // 
     // This is the part of the code that should set one label with a value returned from "buscaCotacao" but it does not work 
     // because at the time the cell is displayed it is still not updated from JSON information: 
     // Note: the buscaCotacao func is working fine 

     cell.precoAtualLabel.text = buscaCotacao(ativo: informacaoCompletaAcao.codigoAcao) 

     return cell 
    } 
沙发
0
1

您需要在接收並解析JSON之後重新加載主線程上的表視圖。

self.acoesTableView.reloadData()

板凳
0
0

我做了一些研究和選拔賽,並在接收到請求的結果後能想出一個非常簡單的(和現在很明顯)解決方案來更新我的標籤: - 我把它檢索功能來自API的更新信息的信息(「buscaCotacao」),包括[cell row]信息 - 我從函數內部更新單元格的標籤,僅在收到回覆後纔會發生:

func tableView (_ tableView:UITableView,cellForRowAt indexPath:IndexPath) - > UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: "standardCell", for: indexPath) as! StandardStockListCell 
    let informacaoCompletaAcao = operacoesAcoes.carteiraAcoes[indexPath.row] 

    cell.codigoTextField.text = informacaoCompletaAcao.codigoAcao 
    cell.nomeTextField.text = informacaoCompletaAcao.nomeAcao 
    cell.quantidadeTotal.text = String(informacaoCompletaAcao.quantidadeTotal) 
    cell.precoMedioLabel.text = "R$ "+String(format: "%.2f", informacaoCompletaAcao.precoMedio) 

    buscaCotacao(ativo: informacaoCompletaAcao.codigoAcao, for: cell, indexPath: indexPath) 

    return cell 
} 

而在功能:

FUNC buscaCotacao(ativo:字符串,用於細胞:StandardStockListCell,indexPath:IndexPath){

let finalURL = "https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&interval=1min&apikey=XXXXXXXXXXXXXX&outputsize=compact&symbol=" + ativo 

    Alamofire.request(finalURL, method: .get) 
     .responseJSON { response in 
      if response.result.isSuccess { 
       let resultadoJSON : JSON = JSON(response.result.value!) 
       let resultado = Float (self.parseResultado(json: resultadoJSON))! 
       cell.precoAtualLabel.text = "R$ "+String(format: "%.2f", resultado) 
       self.cotacoes[ativo] = resultado 

      } else { 
       cell.precoAtualLabel.text = "N/D" 
       print("Error: (response.result.error!)") 
      } 
    } 
} 
0
votes
answers
58 views
+10

如何爲集合視圖創建多個數據源?

0

我有一個tableview有兩個單元格和兩個嵌入式collectionviews在這些單元格內。當它試圖讓第二個單元格變形時,我的應用程序不斷崩潰。我使用了Ash Furrows教程作爲這個項目的基礎,我將在這裏鏈接。 Tutorial link如何爲集合視圖創建多個數據源?

我該如何解決這個問題?這裏是一些示例代碼。

我有兩個不同的細胞,它們各自有這個代碼

class TableViewCell: UITableViewCell { 

    @IBOutlet weak var collectionView: UICollectionView! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

    override func setSelected(_ selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

     // Configure the view for the selected state 
    } 

    func setCollectionViewDataSourceDelegate <D: UICollectionViewDataSource & UICollectionViewDelegate> (dataSourceDelegate: D, forRow row: Int) { 
     collectionView.delegate = dataSourceDelegate 
     collectionView.dataSource = dataSourceDelegate 
     collectionView.tag = row 
     collectionView.reloadData() 
    } 
} 

這自己的階級是代碼的其餘部分展示我如何出隊我的手機

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
     if indexPath.section == 1 { 
      guard let tableViewCell = cell as? TableViewCell else { 
       return 
      } 

      tableViewCell.setCollectionViewDataSourceDelegate(dataSourceDelegate: self, forRow: indexPath.row) 
     } 

     if indexPath.section == 2 { 
      guard let tableViewCell2 = cell as? TableViewCell2 else { 
       return 
      } 
      tableViewCell2.setCollectionViewDataSourceDelegate(dataSourceDelegate: self, forRow: indexPath.row) 
     } 


     // we store the offset from here into the dictionary we created above 
     //tableViewCell.collectionViewOffset = storedOffsets[indexPath.row] ?? 0 
    } 

    func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
     guard let tableViewCell = cell as? TableViewCell else { return } 

     storedOffsets[indexPath.row] = tableViewCell.collectionViewOffset 
    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     print(indexPath) 
    } 
} 

// collectionView inside tableview cell 

extension TabViewController1: UICollectionViewDelegate, UICollectionViewDataSource { 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return model[collectionView.tag].count 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 


     if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath) as? CollectionCell1 { 
      cell.backgroundColor = UIColor.gray 
      return cell 
     } 

     if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell2", for: indexPath) as? CollectionCell2 { 
      cell.backgroundColor = UIColor.purple 
      return cell 
     } 

     return UICollectionViewCell() 
    } 

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
     print("Collection view at row (collectionView.tag) selected index path (indexPath)") 
    } 
} 

任何幫助將非常感謝!

編輯:這是整個視圖控制器類

class TabViewController1: UIViewController, UITableViewDelegate { 

    @IBOutlet private var tableView: UITableView! 

    var model: [[UIColor]] = [] 

    // Here we create a new dictionary to store the offests, corresponding to their rows. 
    var storedOffsets = [Int: CGFloat]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     print("tab1") 

     model = generateRandomData() 
     tableView.delegate = self 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     print("tab 1 viewWillAppear") 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func generateRandomData() -> [[UIColor]] { 
     let numberOfRows = 20 
     let numberOfItemsPerRow = 15 

     return (0..<numberOfRows).map { _ in 
      return (0..<numberOfItemsPerRow).map { _ in UIColor.randomColor() } 
     } 
    } 
} 

extension TabViewController1: UITableViewDataSource { 

    func numberOfSections(in tableView: UITableView) -> Int { 
     return 5 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if section == 3 { 
      return 1 
     } 
     if section == 4 { 
      return 6 
     } else { 
      return 1 
     } 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     if indexPath.section == 0 { 
      let cell = tableView.dequeueReusableCell(withIdentifier: "featuredPicture", for: indexPath) as! FeaturedVideoTableViewCell 
      return cell 
     } 

     if indexPath.section == 1 { 
      let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell 
      return cell 
     } 


     if indexPath.section == 2 { 
      let cell = tableView.dequeueReusableCell(withIdentifier: "Cell2", for: indexPath) as! TableViewCell2 
      return cell 
     } 

     if indexPath.section == 3 { 

      let cell = tableView.dequeueReusableCell(withIdentifier: "headerCell", for: indexPath) as! HeaderTableViewCell 
      return cell 
     } 

     if indexPath.section == 4 { 

      let cell = tableView.dequeueReusableCell(withIdentifier: "categoryCell", for: indexPath) as! CategoryTableViewCell 
      return cell 
     } 

     return UITableViewCell() 

    } 

    // titleForHeaderInSection doesnt get called because I implemented the bottom method which is `viewForHeaderInSection`. 
    // I am trying to figure out if we can use both at the same time 
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 

     if section == 0 { 
      return "Featured" 
     } 

     if section == 1 { 
      return "Cool Stuff" 
     } 

     if section == 2 { 
      return "Awesome Stuff" 
     } 

     if section == 3 { 
      return "nothing" 
     } 

     if section == 4 { 
      return "Categories" 
     } 

     return String() 
    } 

    // viewForHeaderInSection 
// func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
//  if section == 3 { 
//   let cell = tableView.dequeueReusableCell(withIdentifier: "headerCell") as! HeaderTableViewCell 
//   return cell 
//  } 
//  return UIView() 
// } 

// func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
//  if section == 3 { 
//   return 50 
//  } 
//  return CGFloat() 
// } 

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
     if indexPath.section == 1 { 
      guard let tableViewCell = cell as? TableViewCell else { 
       return 
      } 

      tableViewCell.setCollectionViewDataSourceDelegate(dataSourceDelegate: self, forRow: indexPath.row) 
     } 

     if indexPath.section == 2 { 
      guard let tableViewCell2 = cell as? TableViewCell2 else { 
       return 
      } 
      tableViewCell2.setCollectionViewDataSourceDelegate(dataSourceDelegate: self, forRow: indexPath.row) 
     } 


     // we store the offset from here into the dictionary we created above 
     //tableViewCell.collectionViewOffset = storedOffsets[indexPath.row] ?? 0 
    } 

    func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
     guard let tableViewCell = cell as? TableViewCell else { return } 

     storedOffsets[indexPath.row] = tableViewCell.collectionViewOffset 
    } 

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     if indexPath.section == 0 { 
      return 350 
     } 

     if indexPath.section == 1 { 
      return 130 
     } 

     if indexPath.section == 2 { 
      return 200 
     } 

     if indexPath.section == 3 { 
      return 50 
     } 

     if indexPath.section == 4 { 
      return 220 
     } 

     return CGFloat() 
    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     print(indexPath) 
    } 
} 

// collectionView inside tableview cell 

extension TabViewController1: UICollectionViewDelegate, UICollectionViewDataSource { 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return model[collectionView.tag].count 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

     if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath) as? CollectionCell1 { 
      cell.backgroundColor = UIColor.gray 
      return cell 
     } 

     if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell2", for: indexPath) as? CollectionCell2 { 
      cell.backgroundColor = UIColor.purple 
      return cell 
     } 

     return UICollectionViewCell() 
    } 


    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
     print("Collection view at row (collectionView.tag) selected index path (indexPath)") 
    } 
} 
+0

你有沒有分段tableview? – ivarun

+0

@ivarun此刻我有部分。我在EDIT中添加了全班,供您參考。感謝您的幫助 – user7097242

沙发
0
0

沒有看到你在哪裏註冊你的課程,很難肯定地說,但我懷疑的是,你要回來以外的東西比你的-cellForRow ...或者-cellForItemAt ...方法中的TableViewCell2(或者實際上崩潰的地方)要多。你所有的力量解包(!)都可能導致問題。在崩潰前放置一個斷點,然後檢查您實際從-dequeueReusableCell調用中返回的內容。

+0

我添加了上面編輯的整個班級?你還想看什麼?我可以寄給你這個虛擬項目來看看嗎? – user7097242

+0

你還在這裏? – user7097242

0
votes
answers
39 views
+10

Swift tableView滾動到行給出的內容的值不正確我的tableview的偏移值

0

在我的應用程序中,我有一個tableview,其中顯示約400個產品。我現在面臨的問題是,在滾動到部分的開始編程就像這樣:Swift tableView滾動到行給出的內容的值不正確我的tableview的偏移值

@objc func CategoryPress(_ button: UIButton) { 

    let indexPath = NSIndexPath(item: 0, section: button.tag) 
    tableView.scrollToRow(at: indexPath as IndexPath, at: UITableViewScrollPosition.top, animated: false) 

} 

我正在爲我的tableView.contentOffset.y一個錯誤的值,直到我達到我的tableview的頂部是不正確停留再次。 只有當滾動到遠離我的起始位置的位置時纔會發生此問題。

雖然手動滾動我不面臨這個問題,我所有的值都是確切的。

我試着滾動到按鈕按下特定的y,但我沒有找到辦法做到這一點。

任何解決方案或替代獲得特定位置將受到高度讚賞。

沙发
0
0

我發現了一個工作的替代它是:

@obj func CategoryPress(_ button: UIButton) { 

    let indexPath = NSIndexPath(item: 0, section: button.tag) 
    var offset: CGPoint = tableView.contentOffset 
    offset.y = CGFloat(Ycoordinates[indexPath.section]) 
    tableView.setContentOffset(offset, animated: true) 

} 
0
votes
answers
40 views
+10

UITableViewCells停止X細胞後正確顯示

2

雨燕4 + Xcode的9UITableViewCells停止X細胞後正確顯示

我一直在這個問題上幾個星期,試圖解決它自己。我希望任何人都可以提供幫助。我沒有在我最初的問題中發佈任何代碼,因爲它是專有的。如果需要幫助解決我的問題,我會很樂意提供。

我有一個自定義的細胞,其含有子視圖,其中一些被隱藏或顯示(使用1000-priorityheight=0約束其期間cellForRowAt添加和刪除),這取決於數據的一個非常複雜的佈局的UITableView。還有一個ImageView,它應該始終是全寬,並且應該更改高度以匹配通過Kingfisher.shared.retrieveImage()加載的圖像。一旦我有了圖像,我就更新了該單元圖像上的aspectRatio約束,並顯示單元格。這適用於前15-20個單元格,但當我滾動更多行時,它會停止運行。圖像很小,居中,某些數據字段沒有更新等。如果我繼續滾動,有時候一個單元格會在這裏和那裏正確行爲,但幾乎都不會。

現在有趣的部分:如果我滾動備份,每一個單元格會自動重新格式化,看起來應該是這樣,之後,每個單元格都是完美的。代碼顯然是有效的 - 我覺得這可能是平臺中的一個bug,但在我假設之前,我想看看是否有其他人遇到過這樣的問題。

再次,非常感謝您提供的任何幫助 - 我非常渴望解決這個問題。

更新:要回答幾個問題,這裏是自定義單元類的一部分代碼片段。這是我如何設置單元格的圖像(其中包括更新寬高比約束),以及如何重置單元格以供重用。

internal var aspectConstraint : NSLayoutConstraint? { 
    didSet { 
     if oldValue != nil { 
      imageView.removeConstraint(oldValue!) 
     } 
     if aspectConstraint != nil { 
      imageView.addConstraint(aspectConstraint!) 
     } 
    } 
} 

override func prepareForReuse() { 
    super.prepareForReuse() 
    aspectConstraint = nil 
    imageView.image = nil 
    for view in subviews { 
     for c in view.constraints { 
      if c.firstAttribute == NSLayoutAttribute.height && c.constant == 0 { 
       view.removeConstraint(c) 
      } 
     } 
    } 
} 

func setCustomImage(image : UIImage) { 
    let aspect = image.size.width/image.size.height 
    let constraint = NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: imageView, attribute: NSLayoutAttribute.height, multiplier: aspect, constant: 0.0) 
    constraint.priority = UILayoutPriority(999) 
    aspectConstraint = constraint 
    imageView.image = image 
} 
+0

可以請你分享一下pic @ joel –

+0

聽起來好像你可能因爲單元重用而有額外的約束。你在做什麼來確保當一個單元格被重用時刪除了添加的任何約束條件?你如何更新縱橫比約束? – vacawama

+0

添加到@vacawama所說的內容:這聽起來很像是單元重用問題。罪魁禍首可能在你的'prepareForReuse'方法中。這應該重置每個被重用到原始狀態的單元。 – Gereon

沙发
0
0

對於任何涉及到誰這個問題,因爲完全缺乏對這個問題的解決方法,我得出的結論是UIKit中是不適合我的目的。我用Texture(以前稱爲AsyncDisplayKit)去了,我的進度已經恢復。

0
votes
answers
27 views
+10

TableView的觀察值

0

我正在創建一個tableview,當單元格數量增加或減少時,它會在高度上動態變化。爲了完成這一點,我添加了一個觀測到我的tableview:TableView的觀察值

tableView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil) 

我收到此用下面的方法:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    tableView.frame = CGRect(x: tableView.frame.origin.x, y: tableView.frame.origin.y, width: tableView.frame.size.width, height: tableView.contentSize.height) 
    tableView.reloadData() 
} 

然而,當我運行此我得到一個錯誤:

Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeed414ff8) 

我相信這些行導致該錯誤的,並已試圖打電話super.observeValue(...)

任何幫助將不勝感激。

+0

你爲什麼這樣做? tableviews height是屏幕上容器的高度,其contentSize.height是正在滾動的內容的高度。當這兩個值相等時,表格將不會滾動。 – Losiowaty

沙发
0
2

Key Objective Observing在Objective C中的工作方式是,您觀察的每個對象的EVERY觀察到的更改都通過相同的observeValue函數。完全可能的是,在從故事板載入tableView之前,你的觀察函數被調用,這就是爲什麼你會崩潰。

你應該至少檢查2個東西,你觸摸的tableView前:

  1. 是對象參數===您的tableView(即這是你要找的對象)
  2. 是keyPath ==到您想要在此對象上觀察的keyPath?
0
votes
answers
48 views
+10

JavaFX:通過選定的組合框更新tableview上下文(綁定)

0

我想通過選擇組合框項目從數據庫顯示數據。 Combobox包含我的數據庫中用戶可以選擇的列。我嘗試了這一點,combobox是好的,代碼工作沒有錯誤,但表不更新。JavaFX:通過選定的組合框更新tableview上下文(綁定)

控制器類:

package application; 

    import java.io.IOException; 
    import java.net.URL; 
    import java.sql.PreparedStatement; 
    import java.sql.ResultSet; 
    import java.util.ResourceBundle; 

    import javafx.collections.FXCollections; 
    import javafx.collections.ObservableList; 
    import javafx.event.ActionEvent; 
    import javafx.fxml.FXML; 
    import javafx.fxml.FXMLLoader; 
    import javafx.fxml.Initializable; 
    import javafx.scene.Node; 
    import javafx.scene.Parent; 
    import javafx.scene.Scene; 
    import javafx.scene.control.ComboBox; 
    import javafx.scene.control.TableColumn; 
    import javafx.scene.control.TableView; 
    import javafx.scene.control.cell.PropertyValueFactory; 
    import javafx.stage.Stage; 

     public class SortareDupaAngajatiController implements Initializable{ 
      final ObservableList<tableAngajati> data=FXCollections.observableArrayList(); 
      final ObservableList<String> optiuni=FXCollections.observableArrayList(); 
      PreparedStatement intabel=null; 
      ResultSet rezultate=null; 
      String prequery; 
      String postquery; 

      @FXML 
      public ComboBox<String> meniu; 
      @FXML 
      TableView<tableAngajati> tabelangajati; 

      @FXML 
      private TableColumn<tableAngajati,String> numesediucol; 

      @FXML 
      private TableColumn<tableAngajati,Integer> angajaticol; 

      @Override 
      public void initialize(URL location, ResourceBundle resources) { 

       comboMeniu(); 
       insertInTabel(); 


      } 


      public void comboMeniu(){ 
       try { 
        String query = "SELECT * FROM maginfo"; 
        PreparedStatement dindb = Conexiune.conexiuneBd.prepareStatement(query); 
        ResultSet rezultate = dindb.executeQuery(); 


        while (rezultate.next()) { 
         optiuni.add(rezultate.getString("nume")); 
         meniu.setItems(optiuni); 
        } 
        dindb.close(); 
        rezultate.close(); 
      } 
      catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
      } 

      public void insertInTabel(){ 

     try { 
        prequery="SELECT * FROM sediu where nume='"+meniu.getValue()+"'ORDER BY numarangajati DESC"; 
        postquery=prequery; 
        intabel= Conexiune.conexiuneBd.prepareStatement(postquery); 
        rezultate=intabel.executeQuery(); 

        while(rezultate.next()){ 
         data.add(new tableAngajati(
           rezultate.getString(2), 
           rezultate.getInt(7) 
           )); 


        } 

        intabel.close(); 
        rezultate.close(); 

       } catch (Exception e) { 
        System.err.println(e); 
       } 

       numesediucol.setCellValueFactory(new PropertyValueFactory<>("numesediu")); 
       angajaticol.setCellValueFactory(new PropertyValueFactory<>("numarangajati")); 
       tabelangajati.setItems(null); 
       tabelangajati.setItems(data); 

      }} 

表類:

 

    package application; 

    public class tableAngajati { 
     private String numesediu; 
     private int angajati; 


     public tableAngajati(String numesediu, int angajati) { 
      super(); 
      this.numesediu=numesediu; 
      this.angajati=angajati; 
     } 

     public String getNumesediu(){ 
      return numesediu; 
     } 

     public void setNumesediu(String numesediu){ 
      this.numesediu=numesediu; 
     } 

     public int getNumarangajati(){ 
      return angajati; 
     } 

     public void setNumarangajati(int angajati){ 
      this.angajati=angajati; 
     } 

    } 

非常感謝!

+1

顯示'fxml'文件 –

+0

@mrmcwolf我下面張貼的FXML。謝謝! – AnoGio

沙发
0
0

FXML文件:

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.ComboBox?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.ScrollPane?> 
<?import javafx.scene.control.Separator?> 
<?import javafx.scene.control.TableColumn?> 
<?import javafx.scene.control.TableView?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.layout.Pane?> 
<?import javafx.scene.text.Font?> 

<AnchorPane prefHeight="389.0" prefWidth="620.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SortareDupaAngajatiController"> 
    <children> 
     <Separator layoutX="178.0" orientation="VERTICAL" prefHeight="382.0" prefWidth="0.0" /> 
     <Pane layoutX="-9.0" layoutY="-1.0" opacity="0.6" prefHeight="390.0" prefWidth="190.0" style="-fx-background-color: #0074D9;"> 
     <children> 
      <Button layoutX="35.0" layoutY="20.0" mnemonicParsing="false" onAction="#arataHome" prefHeight="100.0" prefWidth="130.0" style="-fx-background-color: #FFF;" text="Home" /> 
      <Button layoutX="35.0" layoutY="146.0" mnemonicParsing="false" onAction="#arataAdaugareSediu" prefHeight="100.0" prefWidth="130.0" style="-fx-background-color: #FFF;" text="Adauga sediu" /> 
      <Button layoutX="35.0" layoutY="272.0" mnemonicParsing="false" onAction="#arataAdaugareMagazin" prefHeight="100.0" prefWidth="130.0" style="-fx-background-color: #FFF;" text="Adauga supermarket" /> 
     </children> 
     </Pane> 
     <Label layoutX="195.0" layoutY="10.0" text="Sortare supermarket-uri dupa nr. de angajati din toate sediile" wrapText="true"> 
     <font> 
      <Font name="Berlin Sans FB" size="16.0" /> 
     </font> 
     </Label> 
     <ScrollPane layoutX="194.0" layoutY="38.0" prefHeight="304.0" prefWidth="414.0"> 
     <content> 
      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="361.0" prefWidth="399.0"> 
       <children> 
        <TableView fx:id="tabelangajati" layoutX="1.0" layoutY="30.0" prefHeight="338.0" prefWidth="411.0"> 
        <columns> 
         <TableColumn fx:id="numesediucol" prefWidth="204.0" sortable="false" text="Sedii" /> 
         <TableColumn fx:id="angajaticol" prefWidth="193.0" sortable="false" text="Numar angajati" /> 
        </columns> 
        </TableView> 
        <ComboBox fx:id="meniu" layoutX="100.0" layoutY="3.0" prefHeight="25.0" prefWidth="209.0" promptText="Selectati supermarket-ul" /> 
       </children></AnchorPane> 
     </content> 
     </ScrollPane> 
     <Button layoutX="556.0" layoutY="354.0" mnemonicParsing="false" onAction="#Inapoi" text="Inapoi" /> 
    </children> 
</AnchorPane> 

+0

將'onAction =「#insertInTabel」'添加到'ComboBox fx:id =「meniu」'中。 –

+0

@mrmcwolf非常感謝你!代碼有效,但是當我從菜單中選擇其他項目時,表格不刷新,它包含之前所有選定的項目。 – AnoGio

+0

@mrmcwolf我做了!我添加'data.removeAll(data);'到insertInTabel嘗試。感謝您的關注! – AnoGio

0
votes
answers
32 views
+10

當我滾動的tableView,我怎麼能知道哪個小區觸摸綠色區域

1

The Screen In My Prototype當我滾動的tableView,我怎麼能知道哪個小區觸摸綠色區域

我的問題是基於The image in the link。因爲我的名氣是不夠的,我不能發表任何的形象在這裏

我們假設格林區域的圖像中固定
而且,我的要求是,當a cell包含GA,that cell's audioPlayer將在單元格說一句話,就像AirPod

OR,你可以把我的要求,因爲When a cell contains the GA, the text of that cell's label changes to "Touch the Green"

我的問題是我在滾動tableView的時候怎麼能得到which one(Cell)是否包含GA? 但我不能找到一種方式來獲得(有關該小區一些位置/索引信息)

任何人都可以幫我嗎?的ObjectiveC的解決方案是好的,斯威夫特的解決方案是爲我好,謝謝你這麼多

+0

ü可以分享屏幕截圖?你需要什麼確切的屏幕? –

+0

Bcos,你不能使用UITableView作爲UIPickerView。所以可能的分享屏幕。 –

+0

https://stackoverflow.com/questions/31515151/uiscrollview-scroll-by-offset這裏有一個圖像鏈接。我問這個基於這個圖像的問題,這個圖像是否使問題清晰? –

沙发
0
1
override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    // We check cells here to set the state of whether it contains the green or not before the scrolling 
    checkCells() 
} 

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    // And we are continuously checking cells while scrolling 
    checkCells() 
} 

func checkCells() { 
    tableView.visibleCells.forEach { cell in 
     if let indexPath = tableView.indexPath(for: cell) { 
      let rect = tableView.rectForRow(at: indexPath) 
      // This is the rect in your VC's coordinate system (and not the table view's one) 
      let convertedRect = self.view.convert(rect, from: tableView) 

      if convertedRect.contains(greenArea.frame) { 
       cell.textLabel?.text = "Touch the Green" 
      } else { 
       cell.textLabel?.text = "Does not touch the Green" 
      } 
     } 
    } 
} 
+0

非常感謝你的幫助,Ruslan。您的代碼清晰易懂,而且正是我想要的。 –

板凳
0
0

如何像:

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    [0, 1, 2].forEach { 
     let rect = tableView.rectForRow(at: IndexPath(row: $0, section: 0)) 
     if rect.contain(GAView.frame) { 
      // play sound here 
     } 
    } 
} 
地板
0
2

在這段代碼中,我使用GreenArea如在UIView中心。 Ruslan's的一些修改答案。

@IBOutlet weak var greenAreaVw: UIView! 
var contHeight : CGFloat = 0.0 
var eachRowHeight : CGFloat = 45 
var topSpaceTableView : CGFloat = 62 
var GreenAreaOriginY : CGFloat = 0.0 

// Give UITableView Edge Insets in ViewDidLoad 

contHeight = ((self.view.frame.size.height/2) - eachRowHeight/2 - topSpaceTableView) 
userTblVw.contentInset = UIEdgeInsets(top: contHeight, left: 0, bottom: contHeight, right: 0) 
userTblVw.contentOffset.y = -contHeight 
GreenAreaOriginY = greenAreaVw.frame.origin.y 

/*-------------------   -----------------------*/ 
func scrollViewDidEndDecelerating(scrollView: UIScrollView) { 

    checkCells() 
} 

func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) { 

    checkCells() 
} 


func checkCells() { 

    userTblVw.visibleCells.forEach { cell in 
     if let indexPath = userTblVw.indexPathForCell(cell) { 

      let rect = userTblVw.rectForRowAtIndexPath(indexPath) 
      let convertedRect = self.userTblVw.convertRect(rect, toView: self.view) 

      if convertedRect.origin.y >= GreenAreaOriginY && convertedRect.origin.y < (GreenAreaOriginY + eachRowHeight) 
      { 
       let contFloat : CGFloat = (eachRowHeight * CGFloat(indexPath.row)) - contHeight 
       userTblVw.setContentOffset(CGPoint(x: 0, y: contFloat), animated: true) 
      } 

     } 
    } 
} 

查找下面截圖:

enter image description here

+0

非常感謝您的幫助,McDonal,您的解決方案非常好,讓tableView具有像pickerView這樣的效果,比我的要求更強大。 –

+0

你可以爲此讚不絕口嗎? –

+0

沒有足夠的聲望。當我得到足夠的,我會upvote你的答案 –

0
votes
answers
30 views
+10

如何在同一個表格視圖單元格的左側顯示錶格視圖標題的標籤?

-1

我知道,它可能與水平滾動的風格集合的看法,但我需要這個垂直one.I被tryed表視圖高度設置爲0,旋轉頭的標籤,但是當我負約束設置標籤它不是顯示由於views.After的層次結構,我tryed帶來的標籤前,too.If你不清醒地認識到,我可以用一些截圖或者源代碼的解釋。如何在同一個表格視圖單元格的左側顯示錶格視圖標題的標籤?

沙发
0
0

您可以創建一個headerView標籤並將其添加到它,並設置標題視圖的文本對齊到左或根據您的需求爲。

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    let headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.width, height: 50)) 
    headerView.layer.borderWidth = 2 
    let myLabel = UILabel() 
    myLabel.frame = CGRectMake(0, 0, tableView.frame.width - 70, 50) 
    myLabel.font = UIFont.boldSystemFontOfSize(18) 
    myLabel.textColor = UIColor.whiteColor() 
    myLabel.textAlignment = .Left 
    myLabel.text = "This is a left alignmen" 
    headerView.addSubview(myLabel) 
    return headerView 
    } 

您可以通過Apple Documentation for Table viewenter image description here

這是標題視圖左對齊的標題視圖。

+0

我們不是在談論同一things.Maybe我無法解釋清楚,無論如何,看看這個, https://imgur.com/a/H3Xpc –

+1

你能分享你的代碼嗎? – Niroj

+0

好吧,我明白了你想要你的標題視圖在左邊,表格視圖單元格在右邊。我是否正確..?只有你的細胞需要滾動? – Niroj

0
votes
answers
48 views
+10

如何從模態VC中刪除VC 1中的tableView行?

1

我正在使用coreData,並簡單地將tableView單元格內容的文本和單元格的顏色發送到模態視圖控制器。在modalVC中,我可以改變文本,當我按下完成時,tableView被更新。 現在我想添加一個功能,其中如果文本被完全刪除,並且用戶按下完成,那麼應該刪除coreData中的數據,所以應該刪除tableView行。如何從模態VC中刪除VC 1中的tableView行?

這是我爲了實現這一目標正在做的:

@IBAction func doneButton(_ sender: Any) { 
if edittasktextview.text.isEmpty == true 
{ 
moContext.delete(editnotes[num] as NSManagedObject) 
     editnotes.remove(at: num) 
} 
else 
{ 
editnotes[num].sNote = edittasktextview.text 
} 
} 

NUM是我從第一個VC發送到模態VC(一種跟蹤哪些細胞被竊聽的)的indexPath

現在,當我關閉模態視圖控制器時,會向第一個VC發送一個通知,以觸發一個基本上在firstVC中重新載入tableView的func。但是,雖然行不再在tableview中看到,但我仍然不得不回到我的rootVC,然後返回到第一個VC來完全更新tableView。

幫助將不勝感激!

+0

你是否在firstVC中使用了'NSFetchedResultsController'? –

+0

不!我應該如何使用它? –

+0

@意義事項我正在使用NSFetchRequest來獲取coreData的東西,並在tableview中顯示它 –

沙发
0
0

使用NSFetchedResultsController可讓您的表視圖由CoreData更改觸??發。

Here's a tutorial讓你開始。還有很多很好的教程和YT視頻很容易找到。

+0

基本上NSFetchedResultsController充當數組的替代? –