我正试图在Xamarin中制作一个简单的游戏,玩家可以获得一个按钮区域,并能够在它们之间划线以完成一个正方形。最终,我想让玩家可以选择将场地设置为他们选择的任意大小,所以我首先填充一个二维的UIButton
对象数组,其大小最终将由用户定义(在我的测试中,它是3x3):
public void CreateBtnArray(int x, int y)
{
int posX = 15;
int posY = 45;
UIButton[,] ButtonArray = new UIButton[x,y];
for (int j = 0; j < y; j++)
{
for (int i = 0; i < x; i++)
{
var frame = new RectangleF (posX, posY, 50, 50);
ButtonArray [i, j] = new UIButton(frame);
ButtonArray [i, j].SetImage (UIImage.FromBundle ("GameButtons/uibuttonnormal.jpg"), UIControlState.Normal);
ButtonArray [i, j].SetImage (UIImage.FromBundle ("GameButtons/uibuttonhighlighted.jpg"), UIControlState.Highlighted);
View.Add(ButtonArray[i,j]);
}
posX = 15;
posY += 100;
}
}
这很好,但我希望用户只能在相邻的按钮之间画一条线,所以我试图在构建阵列时向阵列中的每个按钮添加一个TouchUpInside
事件,这样我的方法中的循环就变成了:
for (int j = 0; j < y; j++)
{
for (int i = 0; i < x; i++)
{
var frame = new RectangleF (posX, posY, 50, 50);
ButtonArray [i, j] = new UIButton(frame);
ButtonArray [i, j].SetImage (UIImage.FromBundle ("GameButtons/uibuttonnormal.jpg"), UIControlState.Normal);
ButtonArray [i, j].SetImage (UIImage.FromBundle ("GameButtons/uibuttonhighlighted.jpg"), UIControlState.Highlighted);
posX += 100;
ButtonArray[i,j].TouchUpInside += (sender, e) =>
{
if(FirstButtonClicked == null)
FirstButtonClicked = ButtonArray[i , j];
//This else if should be where the button checks if it's adjacent to the first button clicked
else if(FirstButtonClicked == ButtonArray[1, 1] ||
FirstButtonClicked == ButtonArray[i + 1, j] ||
FirstButtonClicked == ButtonArray[i, j + 1] ||
FirstButtonClicked == ButtonArray[i, j - 1])
{
//Do Stuff
}
};
View.Add(ButtonArray[i,j]);
}
posX = 15;
posY += 100;
}
}
代码符合要求,没有错误,但当我试图点击按钮时,我会收到Array Index Out of Range
异常。我认为TouchUpInside
事件使用的是i
和j
的最后一个已知值,而不是单击按钮的数组索引。到目前为止,我所发现的一切似乎都假设按钮是用一个特定的、易于引用的名称创建的,而不是像我在这里那样随意创建的。如何将TouchUpInside
事件正确地附加到每个按钮,以便还可以检查阵列中按下的第二个按钮是否与第一个按钮相邻?
当使用i.ToString() + j.ToString()
作为按钮的标识符创建按钮时,我为每个按钮分配了一个Accessibility Identifier
,然后将每个按钮附加到一个通用事件处理程序,从而解决了我的问题。当我稍后需要与每个按钮进行交互时,我可以在通用处理程序中使用sender.AccessibilityIdentifier
进行交互。