天道酬勤,学无止境

制作索引控制数组?(Making an indexed control array?)

问题

C#是否已索引控制数组? 我想举一个带有5个按钮的“按钮数组”,这些按钮仅使用一个事件处理程序来处理所有这5个控件的索引(就像VB6一样)。 否则,我必须为这5个按钮中的每个按钮编写一个额外的事件处理程序。 如果我有100个按钮,则需要100个事件处理程序? 我的意思是这样的:

TextBox1[i].Text="Example";

对于我来说,使用控制数组可以使编码工作变得更加容易。 现在我知道,C#至少在用户控件上没有可见的数组功能,并且在用户控件上没有“ index”属性。 所以我想C#没有控制数组,或者我必须以已知名称调用每个元素。

我不必编写for循环中的100个TextBoxes 100个递增值,而是要编写:

TextBox1.Text = Value1;
TextBox2.Text = Value2;
...
...
TextBox100.Text = Value100;

还有更多的工作和所有这100个事件处理程序,每个处理程序额外需要一个额外的TextBox。

回答1

正如我在对HatSoft解决方案的评论中提到的那样,C#Winforms不允许您创建控件数组,就像旧的VB6允许我们使用的那样。 我认为我们可以找到的最接近的是HatSoft和Bert Evans在其帖子中显示的内容。

我希望可以满足您要求的一件事是事件处理程序,您将获得一个公共事件处理程序,并且在事件处理程序中,当您键入“发送方”时,您将直接获得控件,就像在VB6中一样

C#

TextBox textBox = sender as TextBox;

VB6

TextBox textBox = TextBox1[i];

因此,您可能遇到的唯一麻烦是将这100个TextBox连接到单个事件处理程序,如果您不是通过代码动态创建控件,而是在设计时手动创建控件,那么所有建议都可以将它们分组在如Panel这样的容器中。 然后在Form Load上将它们全部连接到单个事件处理程序,如下所示:

foreach (Control control in myTextBoxPanel.Controls)
{
    if(control is TextBox)
         control.TextChanged += new EventHandler(control_TextChanged);
}
回答2

我知道我参加这个聚会有点晚了,但是这个解决方案可以用:

制作一个全局数组:

    TextBox[] myTextBox;

然后在您的对象的构造函数中,

    InitializeComponent();

初始化你的数组:

    myTextBox = new TextBox[] {TextBox1, TextBox2, ... };

现在,您可以迭代控件数组:

    for(int i = 0; i < myTextBox.Length; i++)
        myTextBox[i].Text = "OMG IT WORKS!!!";

我希望这有帮助!

皮特

回答3

只需创建一个处理程序,然后将所有按钮都指向该处理程序即可。

var ButtonHandler = (sender, args) => {
    var clicked = (Button)sender;
    if (clicked.Text == "whatever")
       //do stuff
    else
       //do other stuff 
};

button1.Click += ButtonHandler;
button2.Click += ButtonHandler;

或者,如果您正在代码中创建控件,则可以使用此答案中指定的一种技术。

回答4

我不必编写for循环中的100个TextBoxes 100个递增值,而是要编写:

for(int i = 0; i <100; i++)
{
   TextBox t = new TextBox(){ Id = "txt_" + i, Value = "txt_" + i};
   t.TextChanged += new System.EventHandler(this.textBox_Textchanged);
  Page.Controls.Add(t);

}

//and for event on TextChanged
private void textBox_Textchanged(object sender, EventArgs e)
    {
        TextBox textBox = sender as TextBox;

        if (textBox != null)
        {
////
        }
    }
回答5

如果您使用的是Web窗体而不是MVC,则可以访问该页面上的控件集合,如在ASP.NET网页中使用控件集合中所示。 本质上,控件集合是一棵树,其中的页面托管第一级子控件,而某些项目则拥有自己的子控件。 有关如何遵循树的示例,请参见如何:通过遍历控件集合在页面上找到Web窗体控件。

另外,请参见如何:以编程方式将控件添加到ASP.NET网页。

您可以将相同的事件处理程序用于多个项目,只要所需的签名相同即可。

对于Windows窗体,这几乎是相同的,因为它们基于相似的体系结构模型,但是您需要Control.Controls属性以及如何:向Windows窗体添加控件。

回答6

需要注意的另一件事:如果您确实需要在一种表单上编辑100个字符串,则可能应该考虑是否100个文本框确实是最好的方法。 也许ListView,DataGridView或PropertyGrid更适合。

这几乎在您认为需要大量控件的任何时候都适用。

回答7

保持简单:

TextBox[] keybox = new TextBox[16];   //create an array

for (int i=0; i<16; i++) 
{
    keybox[i] = new TextBox();        //initialize (create storage for elements)
    keybox[i].Tag = i;                //Tag prop = index (not available at design time)
    keybox[i].KeyDown += keybox_down; //define event handler for array
}

private void keybox_down(object sender, KeyEventArgs e)
{
    int index = (int)((TextBox)sender).Tag    //get index of element that fired event
    ...
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何使用ng-click从数组中删除项目或对象?(How do I delete an item or object from an array using ng-click?)
    问题 我正在尝试编写一个函数,该函数使我可以在单击按钮时删除项目,但我认为我对该函数感到困惑-我是否使用$digest ? HTML和app.js: <ul ng-repeat="bday in bdays"> <li> <span ng-hide="editing" ng-click="editing = true">{{bday.name}} | {{bday.date}}</span> <form ng-show="editing" ng-submit="editing = false"> <label>Name:</label> <input type="text" ng-model="bday.name" placeholder="Name" ng-required/> <label>Date:</label> <input type="date" ng-model="bday.date" placeholder="Date" ng-required/> <br/> <button class="btn" type="submit">Save</button> <a class="btn" ng-click="remove()">Delete</a> </form> </li> </ul> $scope.remove = function(){ $scope
  • PHP应用程序URL路由(PHP Application URL Routing)
    问题 因此,我正在写一个框架,我希望以此为基础来开发一些我正在使用的应用程序(该框架在那里,所以我有一个可以使用的环境,以及一个使我可以使用一个系统的系统,例如登录) 我要创建这个框架,并且它的应用程序都使用面向资源的体系结构。 现在,我想创建一个URL路由类,该类可以由APP编写器(也可能由CMS App用户)扩展,但我想通过查看以下方法找出最佳方法:其他应用程序如何做到这一点。 回答1 我比较喜欢使用reg ex而不是制作自己的格式,因为这是常识。 我写了一个小类,使我可以嵌套这些正则表达式路由表。 我曾经使用过类似的通过继承实现的方法,但是它不需要继承,因此我重写了它。 我对一个键进行正则表达式,然后映射到我自己的控制字符串。 请看下面的例子。 我访问了/api/related/joe ,我的路由器类创建了一个新的对象ApiController并调用它的方法relatedDocuments(array('tags' => 'joe')); // the 12 strips the subdirectory my app is running in $index = urldecode(substr($_SERVER["REQUEST_URI"], 12)); Route::process($index, array( "#^api/related/(.*)$#Di" =>
  • 带数字和范围的AngularJS For循环(AngularJS For Loop with Numbers & Ranges)
    问题 Angular确实在其HTML指令中使用数字为for循环提供了一些支持: <div data-ng-repeat="i in [1,2,3,4,5]"> do something </div> 但是,如果您的范围变量包含具有动态数字的范围,则您每次都需要创建一个空数组。 在控制器中 var range = []; for(var i=0;i<total;i++) { range.push(i); } $scope.range = range; 在HTML中 <div data-ng-repeat="i in range"> do something </div> 这行得通,但是没有必要,因为我们根本不会在循环中使用范围数组。 有谁知道设置最小值/最大值的范围或常规值? 就像是: <div data-ng-repeat="i in 1 .. 100"> do something </div> 回答1 我微调了这个答案,并提出了这个小提琴。 过滤器定义为: var myApp = angular.module('myApp', []); myApp.filter('range', function() { return function(input, total) { total = parseInt(total); for (var i=0; i<total; i++) {
  • Array.map的概念是什么?(What is the concept of Array.map?)
    问题 我在理解Array.map的概念时遇到问题。 我确实去过Mozilla和Tutorials Point,但是他们提供的信息非常有限。 这就是我使用Array.map 。 这有点复杂(涉及到d3.js的一部分;请忽略它) var mapCell = function (row) { return columns.map(function(column) { return { column : column, value : getColumnCell(row, column) } }) } //getColumnCell is a function defined in my code //columns is array defined at the top of my code 我不完全了解这段代码在做什么。 我知道它会返回一个新的数组和东西,但是这部分有些棘手! 如果您想浏览一下我的代码:http://jsfiddle.net/ddfsb/2/ 更新1 我正在使用控制台来实际了解代码内发生的事情。 查看提供的答案,我已经清楚地理解了array.map的概念。 现在剩下的唯一部分是参数行和列,但是提供的小提琴中的行和行以及列和列之间是有区别的 var rows//completely ok var columns//completely ok funcion(row)/
  • webgl中绑定缓冲区的逻辑是什么?(What is the logic of binding buffers in webgl?)
    问题 我有时会发现自己在以不同顺序声明缓冲区(使用createBuffer / bindBuffer / bufferdata)与将其重新绑定到代码的其他部分(通常在绘制循环中)之间挣扎。 如果在绘制数组之前不重新绑定顶点缓冲区,则控制台会抱怨尝试访问超出范围的顶点。 我的怀疑是最后一个绑定对象在指针处传递,然后传递到drawarrays,但是当我在代码开头更改顺序时,什么都没有改变。 有效的方法是在绘制循环中重新绑定缓冲区。 因此,我无法真正理解其背后的逻辑。 您何时需要重新绑定? 为什么需要重新绑定? attribute0指的是什么? 回答1 我不知道这是否有帮助。 有人说过,GL / WebGL有很多内部状态。 您调用的所有功能均会设置状态。 完成所有设置后,您将调用drawArrays或drawElements并将所有状态用于绘制内容 SO的其他地方对此进行了解释,但是绑定缓冲区只是在WebGL内设置2个全局变量中的1个。 之后,通过缓冲区的绑定点引用该缓冲区。 你可以这样想 gl = function() { // internal WebGL state let lastError; let arrayBuffer = null; let vertexArray = { elementArrayBuffer: null, attributes: [ { enabled
  • 在进行foreach时更改数组中的值(change values in array when doing foreach)
    问题 例子: var arr = ["one","two","three"]; arr.forEach(function(part){ part = "four"; return "four"; }) alert(arr); 数组仍保留其原始值,是否可以通过迭代函数对数组元素进行写访问? 回答1 回调传递给元素,索引和数组本身。 arr.forEach(function(part, index, theArray) { theArray[index] = "hello world"; }); 编辑-如在评论所指出的, .forEach()函数可以取的第二参数,该参数将被用作的值this在每次调用回调: arr.forEach(function(part, index) { this[index] = "hello world"; }, arr); // use arr as this 这第二个例子显示arr本身被设置为this在callback.One可能会认为参与该阵列.forEach()调用可能是默认值this ,但它不是不管什么原因; this将是undefined ,如果没有提供第二个参数。 (注:关于上面的东西this不一样,如果回调是一个应用=>函数,因为this时候被调用这些函数永远不会绑定到任何东西。) 同样重要的是要记住,Array原型上提供了一整套类似的实用程序
  • 为什么在数组迭代中使用“ for…in”是个坏主意?(Why is using “for…in” for array iteration a bad idea?)
    问题 有人告诉我不要将for...in用于JavaScript for...in的数组。 为什么不? 回答1 原因是一种构造: var a = []; // Create a new empty array. a[5] = 5; // Perfectly legal JavaScript that resizes the array. for (var i = 0; i < a.length; i++) { // Iterate over numeric indexes from 0 to 5, as everyone expects. console.log(a[i]); } /* Will display: undefined undefined undefined undefined undefined 5 */ 有时可能与另一个完全不同: var a = []; a[5] = 5; for (var x in a) { // Shows only the explicitly set index of "5", and ignores 0-4 console.log(x); } /* Will display: 5 */ 还请考虑JavaScript库可能会执行以下操作,这会影响您创建的任何数组: // Somewhere deep in your JavaScript
  • 是否可以在UIPageViewController中以编程方式打开页面?(Is it possible to Turn page programmatically in UIPageViewController?)
    问题 是否可以在UIPageViewController以编程方式打开页面? 回答1 是的,可以使用以下方法: - (void)setViewControllers:(NSArray *)viewControllers direction:(UIPageViewControllerNavigationDirection)direction animated:(BOOL)animated completion:(void (^)(BOOL finished))completion;` 这与在页面上设置第一个视图控制器所使用的方法相同。 同样,您可以使用它来转到其他页面。 想知道为什么viewControllers是一个数组,而不是单个视图控制器? 这是因为页面视图控制器可能具有“书脊”(例如在iBooks中),一次显示2页内容。 如果一次显示一页内容,则只需传入一个1元素的数组即可。 Swift中的一个例子: pageContainer.setViewControllers([displayThisViewController], direction: .Forward, animated: true, completion: nil) 回答2 由于我也需要此功能,因此我将详细介绍如何执行此操作。 注意:我假设您使用标准模板形式来生成UIPageViewController结构
  • 如何用Java制作数组的数组(How to make an array of arrays in Java)
    问题 假设地,我有5个字符串数组对象: String[] array1 = new String[]; String[] array2 = new String[]; String[] array3 = new String[]; String[] array4 = new String[]; String[] array5 = new String[]; 我希望另一个数组对象包含这5个字符串数组对象。 我该怎么做? 我可以把它放在另一个数组中吗? 回答1 像这样: String[][] arrays = { array1, array2, array3, array4, array5 }; 或者 String[][] arrays = new String[][] { array1, array2, array3, array4, array5 }; (后一种语法可以在变量声明点之外的赋值中使用,而较短的语法仅适用于声明。) 回答2 尝试 String[][] arrays = new String[5][]; 回答3 尽管有两个很好的答案告诉您如何做,但是我感到缺少另一个答案:在大多数情况下,您根本不应该这样做。 数组很麻烦,在大多数情况下,最好使用Collection API。 使用集合,您可以添加和删除元素,并且有专门的集合用于不同的功能(基于索引的查找,排序,唯一性
  • 如何在PHP中重新索引数组,但索引从1开始?(How do you reindex an array in PHP but with indexes starting from 1?)
    问题 我有以下数组,我想对其重新索引,以使键反向(理想情况下从1开始): 当前数组(编辑:该数组实际上看起来像这样): Array ( [2] => Object ( [title] => Section [linked] => 1 ) [1] => Object ( [title] => Sub-Section [linked] => 1 ) [0] => Object ( [title] => Sub-Sub-Section [linked] => ) ) 应该如何: Array ( [1] => Object ( [title] => Section [linked] => 1 ) [2] => Object ( [title] => Sub-Section [linked] => 1 ) [3] => Object ( [title] => Sub-Sub-Section [linked] => ) ) 回答1 如果要重新索引从零开始,只需执行以下操作: $iZero = array_values($arr); 如果您需要从头开始,请使用以下命令: $iOne = array_combine(range(1, count($arr)), array_values($arr)); 以下是所用功能的手册页: array_values() array_combine() 范围()
  • Java官方教程(二-3)数组 Arrays(2020.12.16)
    前言 本文是橙子出于兴趣爱好对Java官方教程的尝试翻译,几乎每日更新,感兴趣的朋友可以关注一下橙子;翻译过程中尽可能多的对一些关键词保留了英文原文,如果你想看最纯正的英文原版教材却又看不懂,可以试着来看一下橙子的翻译版啊,欢迎大家留言讨论,冲鸭! 更多相关文章点击阅读 Java官方教程目录2020最新版 语言基础 数组 Arrays 数组 Arrays An array 是一个包含固定数量的单一类型(single type)的容器对象(container object)。创建array时将确定array的长度。创建后,其长度是固定的。在“Hello World” application的main方法中,你已经看到了数组的示例,本节将讨论数组的更多细节。 Array中的每一个item都叫做element。每一个element都可以通过数字索引(numerical index)进行访问。如上图所示,编号从0开始,例如,第9个元素将在index 8处访问。 下面的program,ArrayDemo,创建了一个整形数组,在数组中存了一些值,并将每个值打印到标准输出。 class ArrayDemo { public static void main(String[] args) { // declares an array of integers int[] anArray; //
  • 是什么导致java.lang.ArrayIndexOutOfBoundsException,如何防止它发生?(What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it?)
    问题 ArrayIndexOutOfBoundsException是什么意思,如何摆脱它? 这是触发异常的代码示例: String[] names = { "tom", "bob", "harry" }; for (int i = 0; i <= names.length; i++) { System.out.println(names[i]); } 回答1 您的第一个停靠港应该是能够对其进行合理清晰解释的文档: 抛出该错误以指示已使用非法索引访问了数组。 索引为负或大于或等于数组的大小。 因此,例如: int[] array = new int[5]; int boom = array[10]; // Throws the exception 至于如何避免...嗯,不要那样做。 小心您的数组索引。 人们有时会遇到的一个问题是认为数组是1索引的,例如 int[] array = new int[5]; // ... populate the array here ... for (int index = 1; index <= array.length; index++) { System.out.println(array[index]); } 这将错过第一个元素(索引0),并在索引为5时引发异常。此处的有效索引为0-4(含0和4)。 正确的,惯用for此处声明是: for
  • 用Java对匹配数组进行排序(Sorting matched arrays in Java)
    问题 假设我有两个数组(在Java中), int []个数字; 和int []颜色; 每个数字的第i个元素对应于其第i个颜色元素。 例如,数字= {4,2,1}颜色= {0x11、0x24、0x01}; 表示数字4是颜色0x11,数字2是颜色0x24,依此类推。 我想对numbers数组进行排序,但是仍然要对它进行排序,以便每个元素与其颜色配对。 前任。 数字= {1,2,4}; 颜色= {0x01,0x24,0x11}; 最干净,最简单的方法是什么? 数组有几千个项目,因此最好放置在适当的位置,但不是必需的。 进行Arrays.sort()和自定义比较器是否有意义? 尽可能使用库函数是可取的。 注意:我知道“最佳”解决方案是为两个元素创建一个类并使用自定义比较器。 这个问题是要问人们最快速的编码方法。 想象一下,在参加编程比赛时,您不想制作所有这些额外的类,比较器的匿名类等。更好的是,忘记了Java。 您将如何用C编写代码? 回答1 如果您保留带有索引的第三个数组并对其进行排序,则可以将定制的比较器与sort()一起使用,并对其进行排序,从而使数据完整无缺。 Java代码示例: Integer[] idx = new Integer[numbers.length]; for( int i = 0 ; i < idx.length; i++ ) idx[i] = i; Arrays
  • 使用json_encode()时删除数组索引引用(Removing array index reference when using json_encode())
    问题 我已经使用jQuery的datepicker制作了一个小型应用程序。 我正在从如下所示的JSON文件中为其设置不可用的日期: { "dates": ["2013-12-11", "2013-12-10", "2013-12-07", "2013-12-04"] } 我想检查给定的日期是否已经在此列表中,如果有的话,将其删除。 我当前的代码如下所示: if (isset($_GET['date'])) //the date given { if ($_GET['roomType'] == 2) { $myFile = "bookedDates2.json"; $date = $_GET['date']; if (file_exists($myFile)) { $arr = json_decode(file_get_contents($myFile), true); if (!in_array($date, $arr['dates'])) { $arr['dates'][] = $_GET['date']; //adds the date into the file if it is not there already } else { foreach ($arr['dates'] as $key => $value) { if (in_array($date, $arr[
  • 什么是IndexOutOfRangeException / ArgumentOutOfRangeException,如何解决?(What is an IndexOutOfRangeException / ArgumentOutOfRangeException and how do I fix it?)
    问题 我有一些代码,执行时会抛出IndexOutOfRangeException ,说, 指数数组的边界之外。 这是什么意思,我该怎么办? 根据使用的类,它也可以是ArgumentOutOfRangeException mscorlib.dll中发生类型'System.ArgumentOutOfRangeException'的异常,但未在用户代码中处理。其他信息:索引超出范围。 必须为非负数并且小于集合的大小。 回答1 它是什么? 此异常表示您正在尝试使用无效索引按索引访问集合项。 当索引小于集合的下限或大于或等于其包含的元素数时,索引无效。 当它被扔 给定一个声明为的数组: byte[] array = new byte[4]; 您可以从0到3访问此数组,超出此范围的值将导致抛出IndexOutOfRangeException 。 创建和访问数组时,请记住这一点。 阵列长度通常,在C#中,数组是从0开始的。 这意味着第一个元素的索引为0,最后一个元素的索引为Length - 1 (其中Length是数组中项目的总数),因此此代码不起作用: array[array.Length] = 0; 另外请注意,如果你有一个多维数组则无法使用Array.Length两个维度,你必须使用Array.GetLength() int[,] data = new int[10, 5]; for
  • 如何按相同的索引对两个数组排序?(How to sort two arrays by same index?)
    问题 我有2个数组。 我想按相同的索引号对它们进行排序。 例如,我有这些: int[] a = {120, 60, 50, 40, 30, 20}; int[] b = {12, 29, 37, 85, 63, 11}; Array.Sort(b); // Now, b is -> b = {11, 12, 29, 37, 63, 85} 我想按b的索引对a进行排序-> a = {20, 120, 60, 50, 30, 40} 如果我还有字符串数组c -> c = {"b", "u", "r", "s", "a", "1"} 我想按b的索引对c进行排序-> c = {"1", "b", "u", "r", "a", "s"} 我怎样才能做到这一点? 预先感谢,问候。 回答1 使用Array.Sort <TKey,TValue>(TKey []键,TValue []项目)可以接受两个输入数组,一个是键的数组,另一个是要使用这些键排序的项目的数组。 在这里,对于您来说, b是您的钥匙, a是您的物品。 因此: Array.Sort(b, a); 将使用的键b到的项目进行排序a 。 我想按b的索引对c进行排序-> c = {"1", "b", "u", "r", "a", "s"} 不清楚你的意思。 在您同时使用b对a进行排序a ? 如果是这样,这很容易,因为我们仍然可以使用上面的代码
  • 在Laravel中向资源控制器添加新方法(Add new methods to a resource controller in Laravel)
    问题 我想知道是否有可能在Laravel中向资源控制器添加新方法,以及如何实现。 我知道这些方法是默认方法(索引,创建,存储,编辑,更新,销毁)。 现在,我想向同一控制器添加其他方法和路由。 那可能吗? 回答1 注册资源之前,只需分别向该方法添加路由: Route::get('foo/bar', 'FooController@bar'); Route::resource('foo', 'FooController'); 回答2 我只是这样做,以添加GET“删除”方法。 创建文件后,只需添加 'AntonioRibeiro\Routing\ExtendedRouterServiceProvider', 到您的app / config.php中的“提供者” 在同一文件中编辑Route别名: 'Route' => 'Illuminate\Support\Facades\Route', 更改为 'Route' => 'AntonioRibeiro\Facades\ExtendedRouteFacade', 并确保这些文件正在自动加载,它们必须位于composer.json中的某个目录中(“自动加载”部分)。 然后,您只需要: Route::resource('users', 'UsersController'); 如果您运行php artisan routes ,这是结果(请看最后一行):
  • 如果我仅在数组中设置高索引,这会浪费内存吗?(If I set only a high index in an array, does it waste memory?)
    问题 在Javascript中,如果我做类似的事情 var alpha = []; alpha[1000000] = 2; 这会浪费内存吗? 我记得读过一些有关Javascript数组的文章,这些文章仍在为未指定的索引设置值(也许将它们设置为undefined?),但是我认为这可能与删除有关。 我真的不记得了。 回答1 看到这个主题:are-javascript-arrays-sparse 在大多数Javascript实现中(可能是所有现代实现),数组都是稀疏的。 这意味着不,它不会分配最大索引数的内存。 如果它类似于Lua实现,则实际上是一个内部数组和字典。 从起始索引开始密集填充的部分将存储在数组中,字典中的稀疏部分将被存储。 回答2 这是一个古老的神话。 数组上的其他索引将不会被分配。 当您分配一个“数组索引”的属性名称时(例如alpha[10] = 'foo' ,该名称表示一个无符号的32位整数),并且它大于Array的length属性的当前值对象,将发生两件事: 将在对象上创建“命名索引”属性。 该length将增加为该index + 1 。 概念证明: var alpha = []; alpha[10] = 2; alpha.hasOwnProperty(0); // false, the property doesn't exist alpha
  • UIPageViewController:返回当前可见视图(UIPageViewController: return the current visible view)
    问题 您如何知道UIPageViewController内部显示的当前页面/视图是UIPageViewController ? 我已经重写了我的子视图的viewDidAppear方法,以便它们在其viewDidAppear方法中将ID发送给父视图。 但是,问题是这样的:我无法可靠地使用该ID作为显示页面的ID。 因为如果用户翻页但中途决定停止翻页并将页面放回原处,则将已经调用viewDidAppear 。 (该视图在卷曲的页面后面可见)。 也许我应该只在当前视图消失的情况下才切换到新的ID。 但是我想知道是否没有更简单的方法来返回当前可见的视图? 回答1 您应该手动跟踪当前页面。 委托方法pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:将告诉您何时更新该变量。 方法transitionCompleted:的最后一个参数可以告诉您用户是否完成了翻页转换。 然后,您可以通过执行以下操作获取当前显示的View Controller self.viewControllers?.first 回答2 从iOS 6开始,我发现viewControllers属性不断更新,因此它将始终保留代表当前页面的一个视图控制器,而没有其他内容。 因此,您可以通过调用viewControllers
  • JavaSE第13篇:常用API、冒泡排序、二分查找、正则
    核心概述:本篇我们将会学习常用的API,其中有Object类、日期相关操作类、数组相关操作类Arrays、正则表达式;同时也会学习关于数组的一些常用算法,其他中有冒泡排序、二分查找法。 第一章:Object类 1.1-概述(了解) java.lang.Object类是Java语言中的根类,每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。 如果一个类没有特别指定父类, 那么默认则继承自Object类。例如: public class MyClass /*extends Object*/ { // ... } 1.2-本地方法(了解) 在Object类的源码中定义了native修饰的方法,native修饰的方法称为本地方法。 本地方法的特点: 被native修饰的方法,非Java语言编写,是由C++语言编写。本地方法在运行时期进入本地方法栈内存,本地方法栈是一块独立内存的区域。本地方法的意义是和操作系统进行交互。 如Object类中部分源码: private static native void registerNatives(); static { registerNatives(); } 当程序运行的时候,Object类会最先被加载到内存中。类进入内存后首先加载自己的静态成员,static代码块中调用了本地方法registerNatives()