标签: tableView

iOS项目开发实战(Swift)—初探TableView

在本次学习TabView过程中,用到了以下基础知识,TabView的优化技术后续再学习。

1.UIAlertController

1)ActionSheet直接从底部弹出提示框

2)Alert直接从中间弹出提示框

3)通过UIAlertAction添加相应的属性(eg:Cancle/OK etc). UIAlertAction中的handler可以通过闭包来实现,闭包里面的action是UIAlertAction

2.UITableView

1)首先要实现UITableViewDataSource和UITableViewDelegate协议;

UITableViewDataSource中三个函数
func numberOfSectionsInTableView(tableView: UITableView) -> Int{ }
通过该函数指定TableView有多少块,默认为1
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ }
通过该函数指定每一块中有多少行
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath){ }

UITableViewDelegate中一个函数
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ }
当选中某一行然后执行的操作

其它相关函数如下(代码注释)
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? { }
当编辑某一行时,添加相应的Action,如Delete/Share,返回的是一个UITableViewRowAction的数组。在其中某个action中实现handler的时候,若用闭包的时候,有两个参数,action是UITableViewRowAction类型的,还有一个是indexPath: NSIndexPath。

3.代码如下:

ViewController.swift

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

var baby = [“宝宝0″,”宝宝1″,”宝宝2″,”宝宝3″,”宝宝4″,”宝宝5″,”宝宝6″,”宝宝7″,”宝宝8″,”宝宝9″,”宝宝10″,”宝宝11”]

var babyImage = [“宝宝0.jpg”,”宝宝1.jpg”,”宝宝2.jpg”,”宝宝3.jpg”,”宝宝4.jpg”,”宝宝5.jpg”,”宝宝6.jpg”,”宝宝7.jpg”,”宝宝8.jpg”,”宝宝9.jpg”,”宝宝10.jpg”,”宝宝11.jpg”]

var tableView = UITableView()
//标记图片是否已经被选中
var isFlag = [Bool](count : 12, repeatedValue: false)
override func viewDidLoad() {
super.viewDidLoad()
//之前这个地方定义的是var tableView局部变量,导致点了delete没反应
tableView = UITableView(frame: CGRectMake(0, 0, 320, 600), style: UITableViewStyle.Plain)
tableView.dataSource = self
tableView.delegate = self
self.view.addSubview(tableView)
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
//每一块有多少行
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return baby.count
}
//绘制cell
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let initIdentifier = “Cell”
let cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: initIdentifier)
//下面两个属性对应subtitle
cell.textLabel?.text = baby[indexPath.row]
cell.detailTextLabel?.text = “baby\(indexPath.row)”

//添加照片
cell.imageView?.image = UIImage(named: babyImage[indexPath.row])
cell.imageView!.layer.cornerRadius = 40
cell.imageView!.layer.masksToBounds = true

//添加附件
cell.accessoryType = UITableViewCellAccessoryType.DetailButton
if isFlag[indexPath.row] {
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
}else{
cell.accessoryType = UITableViewCellAccessoryType.None
}
return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//使用闭包,和嵌套函数或者JAVA中的匿名类类似
let locationActionHandler = {(action: UIAlertAction!) -> Void in
let locationAlertController = UIAlertController(title: nil, message: “我是宝宝\(indexPath.row)”, preferredStyle: UIAlertControllerStyle.Alert)
let okAction = UIAlertAction(title: “OK”, style: UIAlertActionStyle.Default, handler: nil)

locationAlertController.addAction(okAction)
self.presentViewController(locationAlertController, animated: true, completion: nil)

}
let alertController = UIAlertController(title: “Baby\(indexPath.row)”, message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)
let cancleAction = UIAlertAction(title: “Cancle”, style: UIAlertActionStyle.Cancel, handler: nil)
alertController.addAction(cancleAction)

let locationAction = UIAlertAction(title: “宝宝是几号”, style: UIAlertActionStyle.Default, handler: locationActionHandler)
alertController.addAction(locationAction)

let markAction = UIAlertAction(title: “标记宝宝我一下”, style: UIAlertActionStyle.Default, handler: {(action: UIAlertAction) -> Void in
let cell = tableView.cellForRowAtIndexPath(indexPath)
//此时可以将图片标记为勾,但是当往下拖动图片之前被标记的勾消失,是因为每次只加载出现在屏幕上的,其它都放在缓存池
cell?.accessoryType = UITableViewCellAccessoryType.Checkmark
self.isFlag[indexPath.row] = true//然后每次加载时候在cellForRowAtIndexPath方法进行判断
})
alertController.addAction(markAction)
presentViewController(alertController, animated: true, completion: nil)
}
//和下一个方法中实现deleteAction效果是一样的
// func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
// if editingStyle == UITableViewCellEditingStyle.Delete{
// self.baby.removeAtIndex(indexPath.row)
// self.babyImage.removeAtIndex(indexPath.row)
// self.isFlag.removeAtIndex(indexPath.row)
// self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Middle)
// }
// }

//分享和删除功能的实现
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
let shareAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: “Share”, handler: {
(action: UITableViewRowAction,indexPath: NSIndexPath) -> Void in
let menu = UIAlertController(title: nil, message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)

let cancelAction = UIAlertAction(title: “Cancle”, style: UIAlertActionStyle.Cancel, handler: nil)
let facebookAction = UIAlertAction(title: “facebook”, style: UIAlertActionStyle.Default, handler: nil)

let twitterAction = UIAlertAction(title: “twitter”, style: UIAlertActionStyle.Default, handler: nil)
menu.addAction(facebookAction)
menu.addAction(twitterAction)
menu.addAction(cancelAction)
self.presentViewController(menu, animated: true, completion: nil)
})
let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: “Delete”, handler: {
(action: UITableViewRowAction,indexPath: NSIndexPath) -> Void in

self.baby.removeAtIndex(indexPath.row)
self.babyImage.removeAtIndex(indexPath.row)
self.isFlag.removeAtIndex(indexPath.row)
self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Left)
})

return [shareAction,deleteAction]
}

//每个cell的高度
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 80
}
//隐藏bar
override func prefersStatusBarHidden() -> Bool {
return true
}

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

}

4.运行结果:

%title插图%num

5.总结

学习Swift一周了,基本是通过看视频,看相关的文档进行学习,不过目前的进度是任重而道远。此外还要抽空学学OC,毕竟OC现在仍然是iOS的主流。在学习过程中发现Swift2.0版的开源项目好少,并且Swift2.0与之前的版本语法差别也很大,只能通过看官方文档进行学习。目前的学习计划就是主要学Swift,同时补补OC的基础知识,加油~

iOS tableView删除行(爬坑记)

有些时间没有做这个操作了:),突然又在项目中遇到这个需求,凭着记忆开始操作!写好代码运行!!!结果……..
砰地一声崩了!错误如下:Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (3) must be equal to the number of rows contained in that section before the update (3), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).
还以为自己数据源集合索引计算错了呢。。。。
后来纠结了一番终于找到原因:
tableView.beginUpdates()
let model:MessageModel = modelArray![indexPath.row]
let index:IndexPath = IndexPath(row: modelArray!.index(of: model)!, section: 0)
modelArray?.remove(at: modelArray!.index(of: model)!)
tableView.deleteRows(at: [index], with: .automatic)
tableView.endUpdates()
丢了加粗的两句,从而导致table在取行数的时候出现错误!!!切记!!!删除添加行的时候操作代码一定要在updatable之间!!!

[IOS]——设置tableView的footerView

效果图

%title插图%num
代码实现
首先需要新建一个类来存放这个底部view(方法多样,这只是我的做法)

%title插图%num
介绍一下单独创造一个xib的做法(因为有些类创建时是不能同时创建xib的,就像我上面那个图的类是继承于UIView,需要自己再创建一个xib

%title插图%num

创建完之后记得要设置这个xib从属于哪个类

%title插图%num
具体代码
.h文件
#import <UIKit/UIKit.h>

@interface upLoaddata : UIView
+(instancetype)setfooter;
@end

.m文件
#import “upLoaddata.h”

@implementation upLoaddata

+(instancetype)setfooter
{
return [[[NSBundle mainBundle] loadNibNamed:@”upLoaddata” owner:nil options:nil] lastObject];
}
//这是设置了view的点击事件
– (IBAction)button:(UIButton *)sender {
//发布通知来监听按钮的点击
//发布通知
NSNotification *post = [NSNotification notificationWithName:@”dowmloadmore” object:nil];
[[NSNotificationCenter defaultCenter]postNotification:post];
}

@end

调用的操作
记得先导入这个类的头文件
self.tableView.tableFooterView = [upLoaddata setfooter];

iOS开发- tableView取消头部(section header)悬停效果

以下分别是三种方法:
1.可以将tableview的style 由plain改成grouped , iOS11之后 修改sectionHeader的高度需要重写 tableView 的 heightForHeader viewForHeader 方法 ,同理sectionFooter 同样需要重写这两个方法

2.重写一下scrollView的代理方法

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
if(scrollView == self.tableView) {
// NSLog(@”%lf”,scrollView.contentOffset.y);
CGFloat sectionHeaderHeight = 15; //headerView高度
if (scrollView.contentOffset.y<=0&&scrollView.contentOffset.y>=-self.tableView.mj_header.TT_Sh) {
scrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
} else if (scrollView.contentOffset.y>sectionHeaderHeight) {
scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
}else if (scrollView.contentOffset.y<=sectionHeaderHeight){
scrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
}
}
}

3.sectionHeader 可以做成一个cell(改变一下背景颜色) 这样看起来和section header没什么区别

4.另外推荐一个自己写的弹出自定义视图的工具,支持pod 给个Star

iOS中tableView每一个section的header的悬浮位置的解决

UITableView很多情况下我们需要分组section,并且需要加上头部视图header和底部视图footer,默认情况下这两个视图是不固定的它们会悬浮在表格的上面

那么有时候我们需要固定它的悬浮位置,这时候可以用下面的方法解决:

1.首先来看看我的问题:

如图所示,我用了一个tableView,分成两组,正常情况下它如上图所示,但是我需要的不是这样的效果,而是如下图所示

是的,就是这样的效果,section0中的cell的大小不变,但是显现出来的高度只要100(cell的高度是300),那么这样的话我在实例化tableView的时候就直接把tableView的frame设置为(0,-200,width,height)了,这样就能按照我的要求显示了,但是问题也来了,再滑动tableView时,header不会悬浮在视图上了,它不见了,,,

问题在哪里呢,这个header不是不悬浮了,而是悬浮到高度-200的位置了,找到了问题,接下来就是解决问题了,那么方法如下:

– (void)scrollViewDidScroll:(UIScrollView *)scrollView {
//该方法是当scrollView滑动时触发,因为UITableView继承自UIScrollView因此在这里也可以调用
CGFloat header = 100;//这个header其实是section1 的header到顶部的距离
if (scrollView.contentOffset.y<=header&&scrollView.contentOffset.y>=0) {
//当视图滑动的距离小于header时
scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
}else if(scrollView.contentOffset.y>header)
{
//当视图滑动的距离大于header时,这里就可以设置section1的header的位置啦,设置的时候要考虑到导航栏的透明对滚动视图的影响
scrollView.contentInset = UIEdgeInsetsMake(header+104, 0, 0, 0);
}
}
OK,问题解决,

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速