我正在尝试使用Swift更改自定义选定TableViewCell的外观。
我是否需要通过设计人员或以编程方式进行此操作?
我尝试了以下内容:
这是我的代码:
@IBOutlet var tableView: UITableView!
var tableData: [String] = ["One", "Two", "Three", "Four"]
override func viewDidLoad() {
super.viewDidLoad()
// Register custom cell
var nib = UINib(nibName: "vwTblCell", bundle: nil)
tableView.registerNib(nib, forCellReuseIdentifier: "cell")
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.tableData.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:TblCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as TblCell
cell.lblCarName.text = tableData[indexPath.row]
cell.imgCarName.image = UIImage(named: tableData[indexPath.row])
return cell
}
func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
println("Row \(indexPath.row) selected")
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 70
}
答案 0 :(得分:19)
我有一个相似的问题。在 cellForRowAtIndexPath 方法集中:
cell.selectionStyle = .None
然后设置 didHighlightRowAtIndexPath ...
func tableView(tableView: UITableView, didHighlightRowAtIndexPath indexPath: NSIndexPath) {
let cell = tableView.cellForRowAtIndexPath(indexPath)
cell!.contentView.backgroundColor = .redColor()
}
func tableView(tableView: UITableView, didUnhighlightRowAtIndexPath indexPath: NSIndexPath) {
let cell = tableView.cellForRowAtIndexPath(indexPath)
cell!.contentView.backgroundColor = .clearColor()
}
答案 1 :(得分:14)
我的两分钱:正确的做法(在视觉上)是使用(tableView)单元格中的指定视图,即selectedBackgroundView属性。但是,您需要首先使用UIView()
对其进行初始化SWIFT 3.0
override func awakeFromNib() {
super.awakeFromNib()
self.selectedBackgroundView = UIView()
self.selectionStyle = .default // you can also take this line out
}
然后您可以在自定义单元格中使用它,如下所示:
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
self.selectedBackgroundView!.backgroundColor = selected ? .red : nil
}
那就是它。当然,您也可以将上面的内容集成到上面提到的UITableView函数中。看看吧。
答案 2 :(得分:13)
您已经拥有正确的方法:didSelectRowAtIndexPath
。在该方法中,您可以调用tableView.cellForRowAtIndexPath(indexPath)
并获取您的单元格。您可以将单元格背景设置为您的颜色:
func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
println("Row \(indexPath.row) selected")
let cell:YourCustomCell = tableView.cellForRowAtIndexPath(indexPath) as YourCell
cell.backgroundColor = UIColor.redColor()
}
或者,更好的方法是检查cellForRowAtIndexPath
方法,如果选择了一个单元格:
if(cell.selected){
cell.backgroundColor = UIColor.redColor()
}else{
cell.backgroundColor = UIColor.clearColor()
}
答案 3 :(得分:13)
更新 Swift 3
此答案基于曹勇答案,旨在更新 Swift 3
对于 Swift 3 ,请在 cellForRowAt indexPath 方法集中使用以下代码:
Dxyy
然后,将其设置为 didHighlightRowAtIndexPath
cell.selectionStyle = .none
答案 4 :(得分:6)
点击单元格时,实际上正在更改子视图背景颜色。该子视图是'selectedBackgroundView'。您可以覆盖cellForRowAtIndexPath TableView委托方法中每个单元格的视图。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("identifier", forIndexPath: indexPath)
let selectedView = UIView()
selectedView.backgroundColor = UIColor(red: 250/255, green: 250/255, blue: 250/255, alpha: 1.0)
cell.selectedBackgroundView = selectedView
return cell
}
将颜色更改为您喜欢的颜色。
答案 5 :(得分:5)
为了保持代码清洁,您应该考虑将您的单元格的屏幕设计相关代码从UITableViewController
移动到UITableViewCell
类。
您的UITableViewController`只需按如下方式设置单元格的选定状态:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
guard let cell = tableView.cellForRow(at: indexPath) else { return }
cell.setSelected(true, animated: true)
}
您可以通过覆盖UITableViewCell
在已成功的var isSelected
课程中实施所需的自定义。使用此解决方案,您可以为每个单元格选择不同的颜色。
class MyTableViewCell: UITableViewCell
{
@IBOutlet weak var label:UILabel!
override var isSelected: Bool
{
didSet{
if (isSelected)
{
self.backgroundColor = UIColor.red
if let label = label
{
label.textColor = UIColor.white
}
}
else
{
self.backgroundColor = UIColor.white
if let label = label
{
label.textColor = UIColor.black
}
}
}
}
}
答案 6 :(得分:1)
首次调用此方法 -
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
cell.textLabel?.text = "Show Label"
cell.backgroundColor = UIColor.redColor()
}
而不是调用此方法
func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
cell.backgroundColor = UIColor.clearColor()
}
对于CollectionView ==
<强> 1 - 强>
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
let cell = dateCollectionView.cellForItemAtIndexPath(indexPath) as! DateCollectionViewCell
cell!.dateLabel.backgroundColor = UIColor.redColor()
}
<强> 2 - 强>
func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
let cell = dateCollectionView.cellForItemAtIndexPath(indexPath) as? DateCollectionViewCell
cell!.dateLabel.backgroundColor = UIColor.clearColor()
}
答案 7 :(得分:1)
SWIFT 5更新
在CRON
方法中将选择样式设置为.none:
cellForRowAT
然后实现func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! Cell
cell.selectionStyle = .none
return cell
}
和didHighlightRowAt
方法:
didUnhighlightRowAt
答案 8 :(得分:0)
override func awakeFromNib() {
super.awakeFromNib()
selectedBackgroundView = UIView()
selectedBackgroundView?.backgroundColor = .blue
}
为什么其他方法错误:
setSelected
方法更改selectedBackgroundView的颜色。backgroundColor
的行为也不同于iOS的行为答案 9 :(得分:0)
@Autowired
private MockMvc mockMvc;
@MockBean
InformationUtileService informationUtileService;
@MockBean
UserService userService;
ObjectMapper mapper = new ObjectMapper();
@Test
public void givenInformationsUtiles_whenGetInfoUtiles_thenReturnJsonArray()
throws Exception {
InformationUtile informationUtile = new InformationUtile();
informationUtile.setId(1);
informationUtile.setContent("oumaima");
informationUtile.setDescription("test");
Media medias = new Media();
medias.setType("image/png");
medias.setUrl("C:\\files\\actualite\\32769\\adobexd.png");
List<Media> allMedias = new ArrayList<Media>();
allMedias.add(medias);
informationUtile.setMedias(allMedias);
OngoingStubbing<User> user = Mockito.when(userService.getUser(Mockito.anyLong())).thenReturn(new User());
Mockito.when(informationUtileService.addOrEditInfoUtile(Mockito.any(InformationUtile.class))).thenReturn(informationUtile);
mockMvc.perform(post("/infoUtile/add/{id}",informationUtile.getId())
.contentType(MediaType.APPLICATION_JSON)
.content(mapper.writeValueAsBytes(informationUtile)))
.andExpect(status().isOk());
}
答案 10 :(得分:-1)
以上答案均无用,因此我尝试了我的方法,并成功了: 这里是:-
func reloadcell() {
if isSelected {
conView.backgroundColor = .yellow
} else if isHighlighted {
conView.backgroundColor = .yellow
} else {
conView.backgroundColor = .clear
}
}
并在layoutsubviews和didselect方法中调用该函数
答案 11 :(得分:-1)
在您的 cellForRowAtIndexPath 方法集中:
cell.selectionStyle = .none
然后像这样设置 didHighlightRowAtIndexPath...
func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath)
cell!.contentView.backgroundColor = .green
}