1. 程式人生 > >iOS中tableview 兩級cell的展開與收回(一)

iOS中tableview 兩級cell的展開與收回(一)

        在我們的很多專案實現過程中,都需要資料的展開與收回,就像騰訊QQ中的聯絡人,也是一個cell的收回操作。上一篇博文講述瞭如何展開一個兩級的資料來源,那麼我們就接著改例城講解一下資料的展開與收回。在這裡主要是為了講解兩個知識點,在tableview中插入資料與刪除資料。

      首先呢,我們要思考一下,如何設定自己的演算法,能夠做到邏輯清楚,程式碼簡介,功能完善呢!在這裡教大家一個比較簡單的方法:仍然用一個數據源,在資料來源裡面給每一個section新增是否展開標誌位,我們來通過判斷這個標誌位確定改section的返回行數與插入或者刪除資料。

using System;
using Foundation;
using System.Collections.Generic;

namespace Expland
{
	public class Data
	{
		public Data ()
		{
		}
		//一級標題
		public  string Title{ get; set;}
		//是否展開標誌位
		public  bool ExplandFlag{ get; set;}
		//二級標題
		public  List<string> SecondTitle = new List<string> ();
	}
}
   

        一般來說,資料的展開與收回都是由於出發一個事件來進行操作的,這裡呢,我們在每一個section的尾部添加了一個小圖示,點選該圖示的時候,圖示旋轉,二級資料展開,再次點選的時候,圖示回到原來位置,資料收回。那麼這裡我們就重新定義了一個繼承UITableViewHeaderFooterView的類,來自定義了section 的樣式。每一個section上面都會又一個來顯示文字的label,一個放置圖片的button,該button上面放置了一個圖片。圖片的旋轉程式碼如下:

                /// <summary>
		/// sectiond 的按鈕點選,順時針旋轉
		/// </summary>
		/// <param name="btn">Button.</param>
		void Rotate(UIButton btn)
		{			
			CABasicAnimation ro = CABasicAnimation.FromKeyPath ("transform.rotation.z");	
			ro.To =new NSNumber (1.57f);
			ro.From =new NSNumber (0);
			ro.Duration = 0.1d;
			ro.Cumulative = false;
			ro.RepeatCount = 1;
			ro.RemovedOnCompletion = false;
			ro.FillMode = CAFillMode.Forwards.ToString();
			btn.Layer.AddAnimation (ro, "Rotation");
		}
		/// <summary>
		/// sectiond 的按鈕點選,逆時針旋轉
		/// </summary>
		/// <param name="btn">Button.</param>
		void ReturnRotate(UIButton btn)
		{			
			CABasicAnimation ro = CABasicAnimation.FromKeyPath ("transform.rotation.z");	
			ro.To =new NSNumber (0);
			ro.From =new NSNumber (1.57f);
			ro.Duration = 0.1d;
			ro.Cumulative = false;
			ro.RepeatCount = 1;
			ro.RemovedOnCompletion = false;
			ro.FillMode = CAFillMode.Forwards.ToString();
			btn.Layer.AddAnimation (ro, "Rotation");
		}

    當我們點選圖片的時候,都會出發一個事件,該事件裡面要處理標誌位的處理,圖片的旋轉,資料的插入和刪除。
                               //展開按鈕的狀態
				ExplandButton.AddTarget(delegate(object sender, EventArgs e) {
				    //判斷狀態
					if(!Title[(int)section].ExplandFlag){
						//標誌位改變
						Title[(int)section].ExplandFlag=true;
						//圖示的旋轉
						UIButton explandButton=(UIButton)sender;
						myTabViSource.Rotate(explandButton);
						//資料插入
						int length=Title[(int)section].SecondTitle.Count;
						NSIndexPath[] arrayIndexPath=new NSIndexPath[length];
						for(int i=0;i<length;i++)
						{
							arrayIndexPath[i]=NSIndexPath.FromRowSection((nint)i,section);
						}
						tableview.InsertRows(arrayIndexPath,UITableViewRowAnimation.Automatic);
					}else{
						//標誌位改變
						Title[(int)section].ExplandFlag=false;
						//圖示的復位
						UIButton explandButton=(UIButton)sender;
						myTabViSource.ReturnRotate(explandButton);
						//資料插入
						int length=Title[(int)section].SecondTitle.Count;
						NSIndexPath[] arrayIndexPath=new NSIndexPath[length];
						for(int i=0;i<length;i++)
						{
							arrayIndexPath[i]=NSIndexPath.FromRowSection((nint)i,section);
						}
						tableview.DeleteRows(arrayIndexPath,UITableViewRowAnimation.Automatic);
					}
				},UIControlEvent.TouchUpInside);